« Insérer Ignorer » VS « Insertion … Dans la mise à jour de la touche en double »

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *