2010-09-19 16 views
70

estoy haciendo un INSERT ... ON DUPLICATE KEY UPDATE para un PRIMARY KEY en la siguiente tabla:¿Por qué se ven afectadas 2 filas en mi `INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA '?

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

Sin embargo, a pesar de que estos valores deben ser únicos, estoy viendo 2 filas afectadas.

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) 

Por qué sucede esto?

EDITAR

Para la comparación, véase la siguiente consulta:

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

¿Por qué tiene dos llaves principales en primer lugar? –

+0

@Pekka, la 'PRIMARY KEY' es un único pk creado en' (uid, iid) 'ya que la mayoría de las consultas se ejecutarán cuando se conozcan ambos valores. –

+0

@Josh veo. El [manual] (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html) parece desalentarlo: 'En general, debe intentar evitar el uso de un ON DUPLICATE CLAVE DE ACTUALIZACIÓN DE TECLAS en tablas con múltiples índices únicos. ¿Tiene que ser una clave principal? ¿Por qué no un índice normal? –

Respuesta

155

De the manual:

Con ACTUALIZACIÓN DE LLAVE DUPLICADA, el valor de filas afectadas por fila es 1 si la fila se inserta como una nueva fila y 2 si se actualiza una fila existente.

+4

¡Gracias! Me alegra ver la referencia en el manual. –

+3

Y 0 si una fila existente está configurada con sus valores actuales. – Svish

+0

@Svish, gracias! Esto es realmente útil. – Green

Cuestiones relacionadas