2010-09-19 2 views
70

Ich bin ein INSERT ... ON DUPLICATE KEY UPDATE für ein PRIMARY KEY in der folgenden Tabelle zu tun:Warum sind 2 Zeilen in meinem `INSERT ... ON DUPLICATE KEY UPDATE 'betroffen?

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 |  | 
+------------+---------------------------------+------+-----+---------+-------+ 

Doch obwohl diese Werte eindeutig sein sollten, ich sehe zwei Zeilen betroffen.

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) 

Warum ist das passiert?

EDIT

Zum Vergleich sehen Sie diese Abfrage:

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 
+0

Warum haben Sie in erster Linie zwei Primärschlüssel? –

+0

@Pekka, der 'PRIMARY KEY' ist ein einzelner PK, der auf' (uid, iid) 'erstellt wurde, da die meisten Abfragen ausgeführt werden, wenn beide Werte bekannt sind. –

+0

@Josh ich sehe. Das [Handbuch] (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html) scheint es jedoch zu entmutigen: 'Im Allgemeinen sollten Sie versuchen, die Verwendung eines ON DUPLICATE zu vermeiden KEY UPDATE-Klausel für Tabellen mit mehreren eindeutigen Indizes. Muss es ein Primärschlüssel sein? Warum nicht ein normaler Index? –

Antwort

155

Von the manual:

Mit ON DUPLICATE KEY UPDATE, der betroffenen Zeilen-Wert pro Zeile ist 1, wenn die Zeile als eine neue Zeile eingefügt wird und 2 wenn eine bestehende Zeile aktualisiert wird.

+4

Danke! Ich freue mich darauf, in der Bedienungsanleitung darauf Bezug zu nehmen. –

+3

Und 0, wenn eine bestehende Zeile auf ihre aktuellen Werte gesetzt ist. – Svish

+0

@Swish, Danke! Das ist sehr hilfreich. – Green

Verwandte Themen