[mysql] 삽입 … 중복 키 (아무것도하지 않음)

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

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 

?



답변

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

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


답변

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

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엔진 으로 사용 하는 경우 동시성에도 영향을 미치므로 사용하기 전에 잘 고려해야합니다. 지금까지 더 나은 해결책을 찾지 못했습니다.


답변

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

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


답변