ʻINSERT… ON DUPLICATE KEY UPDATE`에서 2 개의 행이 영향을받는 이유는 무엇입니까?


91

다음 표에서 INSERT ... ON DUPLICATE KEY UPDATEfor a PRIMARY KEY를 수행하고 있습니다 .

DESCRIBE users_interests;
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+

그러나 이러한 값은 고유해야하지만 2 개의 행이 영향을받는 것으로 나타났습니다.

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE preference='like';
Query OK, 2 rows affected (0.04 sec)

왜 이런 일이 발생합니까?

편집하다

비교를 위해 다음 쿼리를 참조하십시오.

UPDATE users_interests SET preference='like' WHERE uid=2 AND iid=2;
Query OK, 1 row affected (0.44 sec)
Rows matched: 1  Changed: 1  Warnings: 0

처음에 두 개의 기본 키가있는 이유는 무엇입니까?
Pekka

1
@Pekka, 두 값을 모두 알고있을 때 대부분의 쿼리가 실행되기 때문에 PRIMARY KEY생성 된 단일 pk입니다 (uid, iid).
Josh Smith

1
@ 조쉬 봐요. 그러나 매뉴얼 은 그것을 낙담시키는 것처럼 보입니다 In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.. 기본 키 여야합니까? 일반 인덱스가 아닌 이유는 무엇입니까?
Pekka

@Pekka, 솔직히 확실하지 않습니다. 나는 여전히 이것에 대해 비교적 새로운 것입니다. 이 경우 인덱스가 더 의미가 있습니까?
Josh Smith

3
@Josh yup, 두 열에 걸쳐있는 일반 인덱스는 여기에서 잘 작동합니다
Pekka

답변:


201

에서 수동 :

ON DUPLICATE KEY UPDATE를 사용하면 행이 새 행으로 삽입 된 경우 행당 영향을받는 행 값은 1이고 기존 행이 업데이트 된 경우 2입니다.


15
기존 행이 현재 값으로 설정된 경우 0입니다.
Svish

1
@Svish, 감사합니다! 이것은 정말 도움이됩니다.
Green

2
난 그냥이 덜 혼란하게 영향을받는 행의 응답 코드 대신 숫자로 반환 된 수, 명확하게 .. 그 뒤에 근거 어떨지 궁금
Sudip 반 다리

... : |. 영향을받는 실제 행 수 를 확인하는 방법이 있습니까? 기존 행이 갱신 되더라도 만 여전히 존재 하나 개의 행이 영향
Ulad Kasach

일괄 삽입도 마찬가지입니까? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.