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을 반환합니다.
위의 코드는, 다음의 경우에만 기능합니다.id
1, 2, 또는 3 입니다.한다면id
10, 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
'source' 카테고리의 다른 글
C 코드를 작성하여 직사각형의 면적을 계산합니다.calculate라는 이름의 단일 함수를 사용하여 면적을 계산합니다. (0) | 2022.11.04 |
---|---|
비활성화/활성화 버튼의 경우 VueJs v-if (0) | 2022.11.04 |
Laravel API Allutive Where 절과 Vue가 작동하지 않음 (0) | 2022.11.04 |
바인드를 사용하여 추가된 이벤트 수신기를 제거하는 중 (0) | 2022.11.04 |
UTC는 서머타임을 준수합니까? (0) | 2022.11.04 |