Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So verhindern Sie doppelte Einfügungen in eine Tabelle

Sie haben keinen eindeutigen Schlüssel für die E-Mail-Adresse . Das ist Ihre beste Hoffnung, da sich so viele John Doe's im System befinden können. Daher ist ein eindeutiger zusammengesetzter Index für den vollständigen Namen niemals eine gute Idee.

Man kann ein INSERT IGNORE ausgeben, das nach einem doppelten Verstoß weitertrottet, als ob nichts passiert wäre (dies ist höchst unempfohlen und in Ihrem Fall nicht möglich, da Ihre eindeutige Einschränkung für E-Mails nicht vorhanden ist). Das Hauptproblem dabei ist, dass Ihr tendenziell (sprich:wahrscheinlich) jegliche Kontrolle über den Ablauf dessen verliert, was passiert, und mit unerwünschten Daten zurückgelassen wird. Verwenden Sie es also nicht, es sei denn, Sie sind ein Profi.

Man kann ausgeben und INSERT ON DUPLICATE KEY UPDATE (a.k.a. IODKU), das ebenfalls einen eindeutigen Schlüssel erfordert (kann auch ein eindeutiger zusammengesetzter Schlüssel sein). Als solches würde keine neue Zeile auftreten, sondern eine Aktualisierung der Zeile. Beispielsweise könnte eine neue Zeile mit 4 Spalten eingefügt werden, aber bei einer Duplizierungsverletzung könnte eine Aktualisierung nur an zwei der Spalten durchgeführt werden, z. B.

unter der Annahme eines PK in einer unsichtbaren Spalte id int , und einen eindeutigen Schlüssel für emailAddr

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

Es ist der eindeutige Schlüssel auf emailAddr, der dafür sorgt, dass dies funktioniert. Übrig bleibt immer nur eine Zeile pro emailAddr.

Sie können also unbegrenzt Joe Smiths haben, aber nur 1 Zeile pro E-Mail-Adresse.

Die Erstellungstabelle für die obige Tabelle könnte so aussehen

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
);

Sie können auch ALTER TABLE-Befehle ausgeben, um Einschränkungen hinzuzufügen, nachdem die Tabelle erstellt wurde. Abhängig von den darin enthaltenen Daten kann der Aufruf fehlschlagen.

Mysql Einfügen bei doppelter Schlüsselaktualisierung , und Tabelle ändern Handbuchseiten.

Ich sage es noch einmal, ohne die richtige Schema-Einrichtung wird IODKU nicht funktionieren und Sie werden mit unerwünschten Zeilen zurückgelassen. Seien Sie also nicht faul. Schema zuerst einrichten es zum Erfolg führen (mit eindeutigen Schlüsseln), dann Fahren Sie mit der Verwendung von IODKU fort.