내 SQL을 대량 업데이트하는 방법
3502 단어 MySQL
INSERT ... ON DUPLICATE KEY 업데이트 구문
나는 이것이 모두가 알고 있는 방법이라고 생각한다.
쉽게 말하면'INSERT를 시도하고 Primary key의 중복이나 unique 제약에 끌리면 UPDATE'라는 문법이다.
대량 업데이트 시 문제점
NOT NULL
이 있고 DEFAULT VALUE
열이 설정되지 않은 경우 모두 지정해야 합니다.DELETE
이후INSERT
이기 때문에 초기 값이 필요한 열은 값입니다. 열거해야 합니다해결 방법
NOT NULL
열 정의DEFAULT VALUE
에 대해 SQL 측면에서 여러 가지 지정을 하지 않도록 합니다INSERT
기록을 생성하고 SQL그럼에도 불구하고 업데이트를 전제로 한 용도라면 역시 부적절하다.항상 INSERT의 용례를 전제로 합니다.
UPDATE, ELT, FIELD 조합
INSERT ... ON DUPLICATE KEY UPDATE
통일적으로 업데이트하고 싶은 것이 인기가 없는지 조사해 봤더니 최근에 알게 된 방법이다.표현
예를 들어 사용자 관리를 고려한 표.
id
username
group_id
234
hoge
백
235
fuga
백
234
foo
200
235
bar
200
238
username
백
하고 싶은 일
group_id = 100
조직에 속한 2명의 사용자 이름은 다음과 같이 변경됩니다.- hoge→hogehoge
- fuga→fugafuga
SQL 문
이런 느낌은 간단한 형식으로 쓸 수 있다.
UPDATE users
SET name = ELT(FIELD(id, 234, 235), 'hogehoge', 'fugafuga')
WHERE id IN (1000, 1001) AND group_id = 100
그룹 내에서 고유 ID 등으로 축소 후 UPDATE를 통일할 때 편리합니다.ELT
ELT () 는 문자열 목록에서 N번째 요소를 반환합니다.N=1은 str1, N=2는 str2를 반환합니다.N이 1보다 작거나 매개변수보다 크면 빈 값이 반환됩니다.ELT()는 FIELD()의 트위트입니다.
FIELD
str1、str2、str3、... 목록에서str의 인덱스 (위치) 를 되돌려줍니다.str를 찾지 못하면 0으로 돌아갑니다.
FIELD()에 대한 모든 매개변수가 문자열이면 모든 매개변수를 문자열로 비교합니다.모든 매개변수가 숫자인 경우 이를 숫자로 비교합니다.그렇지 않으면 매개 변수와 배 정밀도를 비교합니다.
만약str가 비어 있다면, 반환값은 0입니다. 왜냐하면 비어 있는 값은 어떤 값과 등가를 비교할 수 없기 때문입니다.FIELD () 는 ELT () 의 트위트입니다.
ELT(FIELD(id, 234, 235), 'hogehoge', 'fugafuga')
먼저
FIELD(id, 234, 235)
에서 id = 234
에서 반환1
ELT(1, 'hogehoge', 'fugafuga)
.ELT(1, 'hogehoge', 'fugafuga)
는 hogehoge
로 확장됩니다.따라서 SQL 전체로서 id=234의 경우
UPDATE users
SET name = 'hogehoge'
WHERE id = 1000 AND group_id = 100
이렇게 전개된 것으로 해석할 수 있다.앞으로 쓸 장면도 많을 것 같다.
Reference
이 문제에 관하여(내 SQL을 대량 업데이트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gyarasu/items/5790459506e2754f62a6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)