삽입 ... 중복 키 (아무것도하지 않음)


184

두 열에 대한 고유 키가있는 테이블이 있습니다.

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

해당 테이블에 행을 삽입하고 싶지만 키가 있으면 아무것도하지 마십시오! 키가 존재하기 때문에 오류가 발생하지 않기를 바랍니다.

다음과 같은 구문이 있음을 알고 있습니다.

INSERT ... ON DUPLICATE KEY UPDATE ...

그러나 다음과 같은 것이 있습니까?

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

답변:


332

예, 사용하십시오 INSERT ... ON DUPLICATE KEY UPDATE id=id( id자체에 할당되어 있어도 행 업데이트를 트리거하지 않음 ).

오류 (변환 오류, 외래 키 오류) 및 자동 증가 필드 소진 (중복 키로 인해 행이 삽입되지 않은 경우에도 증가)에 신경 쓰지 않으면을 사용하십시오 INSERT IGNORE.


5
삽입 후 IGNORE를 추가하기 위해 나머지 구문은 동일합니까?
ufk

25
@ufk : INSERT IGNORE포함하지 않는 ON DUPLICATE KEY예를 들어 부품,INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
INSERT IGNORE는 데이터 변환 실패와 같은 다른 오류도 무시합니다.
mjcopple

36
ON DUPLICATE KEY UPDATE id = id를 사용하겠습니다. 다른 종류의 오류가 아닌 키 복제 만 무시하고 싶습니다.
ufk

7
INSERT IGNORE는 행이 삽입되지 않은 경우에도 자동 증분 열을 증가시킵니다.
WorM

9

'없는 경우 삽입'을 구현하는 방법은 무엇입니까?

1. REPLACE INTO

찬성 :

  1. 단순한.

단점 :

  1. 너무 느린.

  2. 자동 일치 키 는 항목과 일치하는 항목이 있거나 이전 항목을 삭제 한 다음 새 항목을 삽입하기 때문에 변경됩니다 (1 씩 증가 ) .unique keyprimary key

2. INSERT IGNORE

찬성 :

  1. 단순한.

단점 :

  1. 항목 일치 항목이 unique key있거나 primary key자동 증분 색인이 1 증가 하면 자동 증분 키가 변경되지 않습니다.

  2. 데이터 변환 오류와 같은 일부 다른 오류 / 경고는 무시됩니다.

삼. INSERT ... ON DUPLICATE KEY UPDATE

찬성 :

  1. 이것으로 '저장 또는 업데이트'기능을 쉽게 구현할 수 있습니다.

단점 :

  1. 업데이트하지 않고 삽입하려는 경우 비교적 복잡해 보입니다.

  2. 항목 일치 항목이 unique key있거나 primary key자동 증분 색인이 1 증가 하면 자동 증분 키가 변경되지 않습니다.

4. 항목이 일치 unique key하거나 primary key? 가있는 경우 자동 증가 키 증가를 중지 할 수있는 방법은 무엇입니까?

@toien의 아래 주석에서 언급했듯이 "자동 증가 열은 innodb_autoinc_lock_mode버전 5.1 이후의 구성 에 따라 달라집니다. " innodb엔진 으로 사용 하는 경우 동시성에도 영향을 미치므로 사용하기 전에 잘 고려해야합니다. 지금까지 더 나은 해결책을 찾지 못했습니다.


자동 증가 열은 innodb_autoinc_lock_mode버전 5.1 이후 구성 에 따라 달라집니다.
toien

1

ON DUPLICATE KEY UPDATE ...,
Negative 사용 : UPDATE두 번째 조치에 자원을 사용 하므로 .

Use INSERT IGNORE ...,
Negative : 문제가 발생하면 MySQL에 오류가 표시되지 않으므로 오류를 처리 할 수 ​​없습니다. 쿼리에 신경 쓰지 않는 경우에만 사용하십시오.


@abdul 여기에 설명 한 mysql 지원이 있습니까?
Lalit Tarsariya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.