내 SQL을 대량 업데이트하는 방법

3502 단어 MySQL
의외로 모르는 좋은 방법이 있어서 기록했어요.

INSERT ... ON DUPLICATE KEY 업데이트 구문


나는 이것이 모두가 알고 있는 방법이라고 생각한다.
쉽게 말하면'INSERT를 시도하고 Primary key의 중복이나 unique 제약에 끌리면 UPDATE'라는 문법이다.

대량 업데이트 시 문제점

  • 업데이트 대상의 표에 NOT NULL 이 있고 DEFAULT VALUE 열이 설정되지 않은 경우 모두 지정해야 합니다.
  • UPDATE로 처리되는 SQL의 경우 내부 동작도 DELETE 이후INSERT이기 때문에 초기 값이 필요한 열은 값입니다. 열거해야 합니다
  • WHERE 자구를 사용할 수 없음(대략)
  • 해결 방법

  • 특별한 어려움이 없으면 NOT NULL 열 정의DEFAULT VALUE에 대해 SQL 측면에서 여러 가지 지정을 하지 않도록 합니다
  • SELECT 한 번에 현재 기록을 끌어온 후 이를 사용하여 새로운 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
  • id: 사용자의 id
  • username: 사용자 이름
  • group_id: 소속 조직의 id
  • id와 group_id 조합 독특
  • 하고 싶은 일

    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 에서 반환1ELT(1, 'hogehoge', 'fugafuga).ELT(1, 'hogehoge', 'fugafuga)hogehoge로 확장됩니다.
    따라서 SQL 전체로서 id=234의 경우
     UPDATE users
     SET name = 'hogehoge'
     WHERE id = 1000 AND group_id = 100
    
    이렇게 전개된 것으로 해석할 수 있다.
    앞으로 쓸 장면도 많을 것 같다.

    좋은 웹페이지 즐겨찾기