Je fais un INSERT ... ON DUPLICATE KEY UPDATE
pour un PRIMARY KEY
dans le tableau suivant:
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 | |
+------------+---------------------------------+------+-----+---------+-------+
Cependant, même si ces valeurs doivent être uniques, je vois 2 lignes affectées.
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)
Pourquoi cela arrive-t-il?
ÉDITER
Pour comparaison, consultez cette requête:
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
mysql
insert
insert-update
Josh Smith
la source
la source
PRIMARY KEY
est un seul pk créé sur(uid, iid)
puisque la plupart des requêtes seront exécutées lorsque les deux valeurs sont connues.In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.
faut-il que ce soit une clé primaire? Pourquoi pas un index normal?Réponses:
À partir du manuel :
la source
… VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
Vous savez donc si vous avez mis à jour une ligne (clé en double) ou si vous en avez simplement inséré une: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
la source