문제

Codeid가 주어진 새 이름으로 20,000 개 이상의 이름을 교체해야합니다.

예를 들어 : 나는 "고양이"가있는 "개"(코드 디드가있는)가 포함 된 모든 행을 업데이트하고 "Horse"(Codeid가 2 인)가 포함 된 모든 행을 업데이트해야합니다. "Bird"등.

첫 번째 SQL 문 : AnimalTable 세트를 업데이트하십시오 cDescription = "고양이"어디에 CodeID = 1

두 번째 SQL 문 : AnimalTable 세트를 업데이트하십시오 cDescription = "새"어디에 CodeID = 2

이 진술은 작동하지만 20,000 개가 넘는 이름이 있기 때문에 더 빠른 방법이 필요합니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

그것이 당신이 할 수있는 가장 빠른 방법입니다.

아니면 단일 명령으로 모든 레코드를 업데이트하고 싶습니까?

가입으로 업데이트를 수행 할 수 있습니다 (고정 구문 ... 한동안 이걸 사용하지 않았습니다)

UPDATE animalTable 
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID 
SET animalTable.cDescription = CodeTable.Description_1;

또 다른 옵션은 업데이트를 더 작은 배치로 분할하는 것입니다. 이렇게하면 테이블이 잠겨있는 시간이 줄어 듭니다. 그러나 업데이트의 총 시간은 더 오래 걸립니다 (정밀한 성능의 개선). 각 배치의 ID 범위.

또한 별도의 테이블에 해당 데이터를 가질 수 있습니다. 데이터가 정규화되지 않기 때문입니다. 더 정규화되도록 멀리 이동하십시오.

다른 팁

번역 값을 보유하고이를 기반으로 업데이트하는 임시 테이블을 만들 수 있습니다.

예를 들어:

create table #TRANSLATIONS
(
    from   varchar(32),
    to     varchar(32)
)

그런 다음 번역 값을 삽입하십시오.

insert into #TRANSLATIONS (from,to) values ('cat','dog')

마지막으로,이를 기반으로 업데이트하십시오.

update MYTABLE
set    myvalue = t.to
where  myvalue = t.from
from   MYTABLE m,
       #TRANSLATIONS t

(테스트되지 않은 내 머리 꼭대기에서).

당신은 a를 사용할 수 있습니다 사례 업데이트하는 진술

동물 테이블 세트 cdescription = case codeid가 1 일 때 '고양이'가 2 일 때 'bird'.... 끝을 업데이트하십시오.

다음과 같은 파일이 있다고 가정하십시오.

1,cat
2,bird
...

해당 파일을 읽고 각 행에 대한 업데이트를 실행하는 스크립트를 작성합니다.

PHP에서 :

$f = fopen("file.csv","r")
while($row = fgetcsv($f, 1024)) {
    $sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0];
    mysql_query($sql);
}
fclose($f);

속도를 높이기 위해 할 수있는 일은 아직 할당하려는 값이없는 레코드 만 업데이트하는 것입니다.

UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"

이 접근법은 명령이 아직 '고양이'가 아닌 레코드 만 업데이트합니다.

면책 조항 : 나는 고양이를 싫어합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top