MySQL ON 중복 키 - 마지막 삽입 ID?
다음 질문이 있습니다.
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
인서트 또는 업데이트 아이디를 원합니다.insert_id()는 갱신된 ID가 아닌 '삽입된' ID만 반환한다고 생각하기 때문에 보통 이 정보를 얻기 위해 두 번째 쿼리를 실행합니다.
2개의 쿼리를 실행하지 않고 행의 ID를 INSERT/UPDATE로 취득할 수 있는 방법이 있습니까?
이 페이지를 확인해 주세요.https://web.archive.org/web/20150329004325/https : // https://web.archive.org/web/20150329004325/https
에 LAST_INSERT_INSERT_INSERT_INSERT를 방법이 설명되어 있습니다.MySQL ID 。
MySQL 문서의 예에서 다음을 수행합니다.
테이블에 AUTO_INCREMENT 열이 있고 INSERT가 있으면...UPDATE는 행을 삽입합니다.LAST_INSERT_ID() 함수는 AUTO_INCREMENT 값을 반환합니다.대신 문이 행을 업데이트하면 LAST_INSERT_ID()는 의미가 없습니다.단, LAST_INSERT_를 사용하면 이 문제를 해결할 수 있습니다.아이디(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_를 사용하면 이 문제를 해결할 수 있습니다.아이디(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
중복 키 업데이트 ID=LAST_INSERT_일 때 문제가 발생했습니다.ID(id)는 프라이머리 키를 1씩 증가시킵니다.따라서 세션 내의 다음 입력 ID는 2씩 증가합니다.
REPLACE는 새로운 데이터를 삽입하기 전에 기존의 일치하는 행을 삭제한다는 것은 주목할 필요가 있습니다.ON DUPLICE KEY UPDATE는 지정한 열만 업데이트하고 행을 유지합니다.
매뉴얼:
REPLACE는 INSERT와 동일하게 기능하지만 테이블 내의 오래된 행이 PRIMAY KEY 또는 UNIQUIE 인덱스의 새 행과 동일한 값을 갖는 경우 새 행을 삽입하기 전에 오래된 행이 삭제됩니다.
기존 솔루션은 자동 증가를 사용하는 경우 작동합니다.사용자가 프레픽스를 정의할 수 있으며 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가 입력됩니다.Prefix가 존재하지 않는 경우 값 3000의 Prefix를 삽입하고 last_insert_id를 3000으로 채웁니다.
언급URL : https://stackoverflow.com/questions/778534/mysql-on-duplicate-key-last-insert-id
'sourcecode' 카테고리의 다른 글
PHP에서 이메일 주소를 확인하는 방법 (0) | 2022.09.19 |
---|---|
PHP: 이미지 파일이 있는지 확인하는 방법 (0) | 2022.09.19 |
String 클래스는 + 연산자를 어떻게 덮어쓰나요? (0) | 2022.09.18 |
날짜를 지정하면 요일을 어떻게 알 수 있나요? (0) | 2022.09.18 |
Python SQL 다른 테이블에서 일치하지 않는 항목을 찾는 방법 (0) | 2022.09.18 |