IT박스

MySQL 업데이트 CASE WHEN / THEN / ELSE

itboxs 2020. 10. 26. 07:49
반응형

MySQL 업데이트 CASE WHEN / THEN / ELSE


이 질문에 이미 답변이 있습니다.

CLI 스크립트를 사용하여 LARGE MyISAM 테이블 (2,500 만 개의 레코드)을 업데이트하려고합니다. 테이블이 다른 것에 의해 잠기거나 사용되지 않습니다.

각 레코드에 대해 단일 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

보라, 쿼리는 CPU를 잡아 먹고 영원히 끝나지 않는다.

놀랍게도 쿼리가 2 천 5 백만 행을 모두 업데이트하여 지정하지 않은 행에 NULL을 배치한다는 사실을 알게되었습니다.

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


이 시도

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)

더 간단합니다.

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)

이것은 uid가 실제로 1, 2, 3 인 경우에만 작동합니다.

출처 : http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_elt


더 간단합니다.

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)

ELSE를 놓 쳤기 때문입니다.

"true 인 첫 번째 조건에 대한 결과를 반환합니다. 일치하는 결과 값이 없으면 ELSE 이후의 결과를 반환하고 ELSE 부분이 없으면 NULL을 반환합니다." ( http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case )

참고 URL : https://stackoverflow.com/questions/12754470/mysql-update-case-when-then-else

반응형