source

MySQL 업데이트 케이스 When/THEN/ELSE

nicesource 2022. 11. 4. 21:25
반응형

MySQL 업데이트 케이스 When/THEN/ELSE

CLI 스크립트를 사용하여 LARGE MyISAM 테이블(2500만 레코드)을 업데이트하려고 합니다.그 테이블은 다른 것에 의해 잠겨지거나 사용되지 않는다.

각 레코드에 대해 단일 UPDATE 쿼리를 실행하는 것이 아니라 CASE 기능을 활용하는 것이 좋다고 생각했습니다.

id필드는 PRIMAY 입니다.다음 쿼리는 밀리초가 걸릴 것으로 예상됩니다.

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

이 쿼리는 CPU를 독점하며 영원히 종료되지 않습니다.

그 후 놀랍게도 쿼리가 2500만 행을 모두 업데이트하여 지정하지 않은 행에 NULL을 배치하고 있음을 알게 되었습니다.

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

이거 드셔보세요

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)

한다면id는 1부터 순차적으로 시작됩니다.가장 심플하고 빠른 것은 다음과 같습니다.

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

ELT()가 문자열 목록의 N번째 요소(N = 1, N = 2인 경우 str2 등)를 반환합니다.N이 1보다 작거나 인수 수보다 클 경우 NULL을 반환합니다.

위의 코드는, 다음의 경우에만 기능합니다.id1, 2, 또는 3 입니다.한다면id10, 20 또는 30 이며, 다음 중 하나가 동작합니다.

UPDATE `table` 
SET uid = CASE id 
WHEN 10 THEN 2952 
WHEN 20 THEN 4925 
WHEN 30 THEN 1592 END CASE 
WHERE id IN (10, 20, 30)

또는 더 간단한 것:

UPDATE `table` 
SET uid = ELT(FIELD(id, 10, 20, 30), 2952, 4925, 1592) 
WHERE id IN (10, 20, 30)

Field()는 str1, str2, str3, ...목록에 있는 str의 인덱스(위치)를 반환합니다.str을 찾을 수 없는 경우 0을 반환합니다.

그건 네가 ELSE를 놓쳤기 때문이야.

"참인 첫 번째 조건에 대한 결과를 반환합니다.일치하는 결과값이 없는 경우 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

반응형