source

ON DUPLICE KEY를 사용하여 삽입하려는 모든 키를 업데이트하는 방법이 있습니까?

goodcode 2023. 1. 29. 20:38
반응형

ON DUPLICE KEY를 사용하여 삽입하려는 모든 키를 업데이트하는 방법이 있습니까?

사용할 수 있다는 것을 알고 있습니다.ON DUPLICATE KEY UPDATE해당 키에 대한 레코드가 이미 있는 경우 특정 값을 업데이트합니다.

할 수 있어요.

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3

하지만 어떻게 하면 열과 값을 두 번 쓰지 않고 이 작업을 수행할 수 있을까요?

아쉽게도 아닙니다.

값을 반복하지 않아도 중간까지 얻을 수 있습니다.

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

하지만 여전히 열을 나열해야 합니다.

사용하다

의 의미REPLACE INTO새 레코드가 새 키 값을 나타내는 경우 새 레코드로 삽입됩니다.

새 레코드에 기존 레코드와 일치하는 키 값이 있으면 키 위반이 무시되고 새 레코드가 기존 레코드를 대체합니다.

유용한 경우 버전 >= 5.0의 경우 "복제 시" 쿼리의 마지막 부분을 손으로 쓰지 않도록 쿼리를 만들었습니다.

SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

출력은 다음과 같습니다.

a=values(a), b=values(b), c=values(c), d=values(d)

a, b, c 및 d 열이 있는 테이블에서 쿼리의 첫 번째 부분에 추가할 수 있습니다.

INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d)

업데이트: 컬럼 목록이 매우 긴 경우 출력이 잘릴 수 있습니다. 위의 쿼리 앞에 다음 문을 사용할 수 있습니다(Iroh 삼촌 감사합니다).

SET SESSION group_concat_max_len = 1000000;

@BendiGawaar의 @Lightness Races in Orbit에 대한 코멘트에 따르면 MySQL 8.019+ 버전은 다음과 같습니다.

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

또는

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

사용 가능set또, 다음과 같이 합니다.

INSERT INTO t1 SET a=1,b=2,c=3 AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

MySQL Docs에서 직접 복사됨

의 사용에 대한 권장 해제 경고VALUES:

새로운 행과 열을 참조하기 위한 VALUES() 사용은 MySQL 8.0.20부터 권장되지 않으며 향후 MySQL 버전에서는 삭제될 예정입니다.대신 이 섹션의 다음 몇 단락에서 설명하는 대로 행 및 열 별칭을 사용하십시오.

이것은 오래된 질문이고 다소 틀에 박히지 않은 답변이지만, 같은 질문에 부딪혀 다른 답변에서 언급된 group_concat_max_len 속성을 설정하는 데 문제가 있어 항상 잘린 결과를 얻고 있었습니다.긴 스크립트를 작성할 때 최종적으로 선택한 또 다른 옵션은 다음 식을 엑셀로 사용하는 것입니다.

=SUBSTITUTE(TRIM(A1), ",", "") & " = VALUES(" & SUBSTITUTE(TRIM(A1), ",", "") & "),"

여기서 A1은 필드 이름을 복사하는 셀입니다.이 작업을 신속하게 수행하기 위해 테이블을 마우스 오른쪽 버튼으로 클릭하고 select 문을 클립보드에 복사합니다. 그러면 모든 컬럼 이름이 표시됩니다. 수식은 쉼표를 삭제합니다.

이게 누군가에게 도움이 되길 바라!

언급URL : https://stackoverflow.com/questions/9537710/is-there-a-way-to-use-on-duplicate-key-to-update-all-that-i-wanted-to-insert

반응형