Чому в моєму `ВСТАВИТИ ... НА ДВОЙНОМУ КЛЮЧОВОМУ ОНОВЛЕННІ` впливають 2 рядки?


91

Я роблю INSERT ... ON DUPLICATE KEY UPDATEдля 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)оскільки більшість запитів буде запущено, коли відомі обидва значення.
Джош Сміт,

1
@ Джош я бачу. Керівництво здається відрадити його , хоча: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.Чи має він повинен бути первинним ключем? Чому не нормальний індекс?
Пекка,

@Pekka, чесно не впевнений. Я все ще відносно новачок у цьому. Чи має індекс більше сенсу в цьому випадку?
Джош Сміт,

3
@Josh yup, нормальний індекс, що охоплює обидва стовпці, тут би добре працював
Пекка,

Відповіді:


201

З посібника :

У режимі ON DUPLICATE KEY UPDATE значення рядків, на які впливає рядок, дорівнює 1, якщо рядок вставлено як новий рядок, і 2, якщо існуючий рядок оновлено.


15
І 0, якщо для існуючого рядка встановлено поточні значення.
Свіш

1
@Svish, дякую! Це справді корисно.
Зелений

2
Мені просто цікаво, що було б обґрунтуванням цього ... зрозуміло, його можна було повернути як код відповіді, а не кількість рядків, що вплинули, щоб зробити його менш заплутаним
Судіп Бхандарі

...: |. Чи є спосіб визначити фактичну кількість уражених рядків? Навіть якщо існуючий рядок оновлено, це все ще стосується лише одного рядка
Улада Касаха

Це те саме для пакетних вкладишів? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.