2012-10-05 3 views
52

CLI 스크립트를 사용하여 큰 MyISAM 테이블 (2,500 만 레코드)을 업데이트하려고합니다. 테이블이 다른 것으로 잠기거나 사용되지 않습니다.MySQL 업데이트 CASE WHEN/THEN/ELSE

각 레코드에 대해 단일 UPDATE 쿼리를 수행하는 대신 CASE 기능을 활용할 수도 있습니다.

id 필드는 PRIMARY입니다. 다음 쿼리에 밀리 초가 걸릴 것으로 판단됩니다.

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    END 

Lo와 보라, 쿼리는 CPU를 소모하여 영원히 끝나지 않습니다.

놀랍게도, 내가 지정하지 않은 행에 NULL을 배치하여 쿼리가 2,500 만 개의 행을 모두 업데이트한다는 것을 알았습니다.

그 목적은 무엇입니까? 이 쿼리를 실행할 때마다 2 천 5 백만 행을 업데이트하지 않고 특정 행에 대해서만 대량 업데이트를 수행 할 수 있습니까? 아니면 개별 업데이트를 수행하고 커밋해야합니까?

+2

'case' 문에'else'를 지정하십시오. 기본값은'null'입니다. –

답변

105

는 것이

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    ELSE `uid` 
    END 
WHERE id in (1,2,3) 
+1

은 완전히 잊었습니다. 고마워. – nick

5

간단한을 시도해보십시오

당신이 다른 놓친 때문이다
UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3) 
4

.

"일치하는 결과 값이 없으면 ELSE가 반환되고 ELSE 부분이 없으면 NULL이 반환됩니다." 간단한 (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

+0

을 지정 했더라도 나머지는 업데이트하지 않겠습니까? 나는 단지 3 만 업데이트 할 필요가있을 때 2 천 5 백만 건의 레코드를 업데이트하고 싶지 않습니다. WHERE 절을 배치하면 문제가 해결됩니다. – nick

+0

ID가 정확히 1, 2, 3이 아닌데도 ELSE BEGIN END – alex