[mysql] 중복 키의 MySQL-마지막 삽입 ID?

다음과 같은 쿼리가 있습니다.

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE a=1

삽입 또는 업데이트의 ID를 원합니다. insert_id ()는 업데이트 된 ID가 아닌 ‘삽입 된’ID 만 반환한다고 생각하기 때문에 일반적으로이를 얻기 위해 두 번째 쿼리를 실행합니다.

두 개의 쿼리를 실행하지 않고 행의 ID를 INSERT / UPDATE하고 검색하는 방법이 있습니까?



답변

이 페이지를 확인하십시오 : https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
페이지 하단 MySQL 함수에 표현식을 전달하여 업데이트에 LAST_INSERT_ID를 의미있게 만드는 방법을 설명합니다.

MySQL 문서 예제에서 :

테이블에 AUTO_INCREMENT 열이 있고 INSERT … UPDATE가 행을 삽입하면 LAST_INSERT_ID () 함수는 AUTO_INCREMENT 값을 반환합니다. 명령문이 대신 행을 업데이트하면 LAST_INSERT_ID ()는 의미가 없습니다. 그러나 LAST_INSERT_ID (expr)를 사용하여이 문제를 해결할 수 있습니다. id가 AUTO_INCREMENT 열이라고 가정하십시오. 업데이트에 LAST_INSERT_ID ()를 의미있게 만들려면 다음과 같이 행을 삽입하십시오.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;


답변

정확히 말하면 이것이 원래 쿼리 인 경우 :

INSERT INTO table (a) VALUES (0)
 ON DUPLICATE KEY UPDATE a=1

그리고 ‘id’는 자동 증가 기본 키이며 이것이 작동하는 솔루션입니다.

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1

여기 모두 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

테이블에 AUTO_INCREMENT 열이 있고 INSERT … UPDATE가 행을 삽입하면 LAST_INSERT_ID () 함수는 AUTO_INCREMENT 값을 반환합니다. 명령문이 대신 행을 업데이트하면 LAST_INSERT_ID ()는 의미가 없습니다. 그러나 LAST_INSERT_ID (expr)를 사용하여이 문제를 해결할 수 있습니다. id가 AUTO_INCREMENT 열이라고 가정하십시오.


답변

레코드가 존재하는 경우 본질적으로 삭제 / 삽입 인 REPLACE를 볼 수 있습니다. 그러나 이렇게하면 자동 증분 필드가 변경되어 다른 데이터와의 관계가 손상 될 수 있습니다.


답변

MySQL 버전이 무엇인지 모르지만 InnoDB에는 autoinc에 버그가 있습니다.

5.1.20의 버그와 5.1.23의 버그 수정
http://bugs.mysql.com/bug.php?id=27405

5.1.31의 버그 및 5.1.33의 버그 수정
http://bugs.mysql.com/bug.php?id=42714


답변

ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID (id)가 기본 키를 1 씩 증가시킬 때 문제가 발생했습니다. 따라서 세션 내 다음 입력의 ID는 2 씩 증가합니다.


답변

주목할 가치가 있으며, 이것은 새 데이터를 삽입하기 전에 REPLACE가 기존의 일치하는 행을 날려 버릴 것입니다. DUPLICATE KEY UPDATE시 지정한 열만 업데이트하고 행을 유지합니다.

로부터 수동 :

REPLACE는 테이블의 이전 행이 PRIMARY KEY 또는 UNIQUE 인덱스의 새 행과 동일한 값을 갖는 경우 새 행이 삽입되기 전에 이전 행이 삭제된다는 점을 제외하고는 INSERT와 똑같이 작동합니다.


답변

자동 증가를 사용하면 기존 솔루션이 작동합니다. 사용자가 접두사를 정의 할 수 있고 3000에서 시퀀스를 다시 시작 해야하는 상황이 있습니다.이 다양한 접두사 때문에 자동 증가를 사용할 수 없으므로 삽입에 대해 last_insert_id가 비어 있습니다. 나는 다음과 같이 해결했다.

INSERT INTO seq_table (prefix, id) VALUES ('$user_prefix', LAST_INSERT_ID(3000)) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id + 1);
SELECT LAST_INSERT_ID();

접두사가 있으면 접두사가 증가하고 last_insert_id가 채워집니다. 접두사가없는 경우 접두사는 값 3000으로 접 두부를 삽입하고 last_insert_id를 3000으로 채 웁니다.