Je recommanderais d’utiliser INSERT...ON DUPLICATE KEY UPDATE
.
> Si vous utilisez INSERT IGNORE
, la ligne ne sera pas insérée s’il entraîne une touche en double. Mais la déclaration ne générera pas d’erreur. Au lieu de cela, il génère un avertissement. Ces cas incluent:
- Insérez une clé en double dans les colonnes avec
PRIMARY KEY
ouUNIQUE
restrictions. - insérez une null dans une colonne avec un
NOT NULL
restriction. - Insérez une ligne à une table de partition, mais les valeurs qui insère ne sont pas affectés à une partition.
si vous utilisez REPLACE
mysql fait un DELETE
suivi par un interne, qui a des effets secondaires inattendus:
- une nouvelle identification auto-incluse est attribuée.
- Le Les lignes dépendantes avec des touches externes peuvent être supprimées (si des touches externes en cascade sont utilisées) ou évitez le
REPLACE
. - Les déclencheurs qui tirent le feu sur
DELETE
est exécuté inutilement. - effets secondaires sont également écartés aux esclaves de la réplication ion.
correction: REPLACE
et INSERT...ON DUPLICATE KEY UPDATE
sont des inventions non standard, des propriétaires, spécifiques Mysql ANSI SQL 2003 définit un MERGE
qui peut résoudre le même besoin (et plus), mais MySQL ne prend pas en charge la MERGE
Déclaration.
Un utilisateur a essayé de modifier ce message (l’édition a été rejetée par les modérateurs). L’édition a essayé d’ajouter une affirmation selon laquelle INSERT...ON DUPLICATE KEY UPDATE
fait une nouvelle affectation d’identification d’auto-éclairage. Il est vrai que le nouvel identifiant est généré mais n’est pas utilisé dans la ligne modifiée.
Voir la démonstration ci-dessous, testée avec le serveur de manière permanente 5.5.28. La variable de configuration innodb_autoinc_lock_mode=1
(la valeur par défaut):
mysql> create table foo (id serial primary key, u int, unique key (u));mysql> insert into foo (u) values (10);mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 10 |+----+------+mysql> show create table foo\GCREATE TABLE `foo` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `u` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1mysql> insert into foo (u) values (10) on duplicate key update u = 20;mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 20 |+----+------+mysql> show create table foo\GCREATE TABLE `foo` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `u` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
Ce qui précède montre que la déclaration Iodku détecte le duplicata et invoque la mise à jour pour modifier la valeur de u
. NOTEZ L’ID
indique qu’une identification a été générée, mais elle n’a pas été utilisée dans la ligne.
tandis que REPLACE
Supprimer la ligne d’origine et insérez une nouvelle ligne, générant et stockant une nouvelle identification d’auto-éclairage:
mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 20 |+----+------+mysql> replace into foo (u) values (20);mysql> select * from foo;+----+------+| id | u |+----+------+| 3 | 20 |+----+------+