Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment empêcher les insertions en double dans une table

Vous n'avez pas de clé unique sur l'adresse e-mail . C'est votre meilleur espoir, car de nombreux John Doe peuvent être dans le système. Ainsi, un index composite unique sur le nom complet n'est jamais une bonne idée.

On peut émettre un INSERT IGNORE qui progresse après une violation en double comme si rien ne se passait (ceci est fortement déconseillé et, dans votre cas, impossible car votre contrainte unique sur le courrier électronique n'est pas présente). Le problème majeur avec cela est que votre tendance (lire:va probablement) perdre tout contrôle du flux de ce qui se passe et se retrouver avec des données indésirables. Ne l'utilisez donc pas, sauf si vous êtes un pro.

On peut émettre et INSERT ON DUPLICATE KEY UPDATE (alias IODKU) qui nécessite également une clé unique (peut également être un composite unique). En tant que tel, une nouvelle ligne ne se produirait pas mais une mise à jour de la ligne. Par exemple, une nouvelle ligne avec 4 colonnes pourrait être insérée, mais en cas de violation de duplication, une mise à jour pourrait être effectuée sur seulement deux des colonnes, telles que

en supposant en dessous d'un PK sur une colonne invisible id int , et une clé unique sur emailAddr

insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]' 
on duplicate key update firstName='Joe',lastName='Smith'

C'est la clé unique sur emailAddr qui fait que cela fonctionne. Reste avec seulement 1 ligne par emailAddr, jamais.

Ainsi, vous pouvez avoir un nombre illimité de Joe Smith, mais seulement 1 ligne par adresse e-mail.

La table de création pour la table ci-dessus pourrait ressembler à

create table person
(  id int auto_increment primary key,
   firstName varchar(50) not null,
   lastName varchar(50) not null,
   emailAddr varchar(150) not null,
   unique key(emailAddr)  -- without this, IODKU will not work
);

Vous pouvez également émettre des commandes ALTER TABLE pour ajouter des contraintes après la création de la table. Selon les données qu'il contient, l'appel peut échouer.

Mysql Insérer lors de la mise à jour de la clé en double , et Alter Table pages de manuel.

Je le répète, sans la configuration de schéma appropriée, IODKU ne fonctionnera pas et vous vous retrouverez avec des lignes indésirables. Alors ne soyez pas paresseux à ce sujet. Configurer le schéma d'abord lui permettant de réussir (avec des clés uniques), puis passer à l'utilisation d'IODKU.