Primärschlüssel für MySQL-Tabellen und eindeutige Indizes verhindern, dass der Tabelle mehrere Zeilen mit demselben Index hinzugefügt werden. Wenn Sie versuchen, eine doppelte Zeile mit einer Standard-INSERT-Anweisung einzufügen, tritt ein Fehler auf und das Einfügen schlägt fehl.
MySQL bietet verschiedene Alternativen zur Standard-INSERT-Anweisung und behandelt doppelte Zeilen leicht unterschiedlich: „INSERT IGNORE“, „INSERT … ON DUPLICATE KEY UPDATE“ und „REPLACE“.
Primärschlüssel und eindeutige Indizes
Primärschlüsselindizes und „UNIQUE“ -Indexeinschränkungen erfordern, dass jede Zeile einen eindeutigen Wert in den Indexspalten enthält, sodass jede Zeile anhand ihres Primärschlüssels oder des Werts in den UNIQUE-Indexeinschränkungsspalten identifiziert werden kann.
Wenn ein normales INSERT versucht, eine Zeile einzufügen, die einen doppelten Wert im Primärschlüssel oder im UNIQUE-Einschränkungsindex enthält, schlägt das Einfügen fehl und führt möglicherweise ein Rollback der gesamten Transaktion durch.
IGNORE EINFÜGEN
INSERT IGNORE fügt Zeilen auf die gleiche Weise wie INSERT ein, mit der Ausnahme, dass Zeilen mit doppelten Werten ignoriert werden und die Ausführung fortgesetzt wird, ohne dass ein Fehler auftritt. Eine Zeile, die einen doppelten Wert enthält, wird nicht eingefügt. zum Beispiel:
INSERT IGNORE INTO my_table (unique_index_column, other_column) VALUES (1, ‚other value‘);
INSERT … ON DUPLICATE KEY UPDATE
INSERT … ON DUPLICATE KEY UPDATE fügt alle nicht doppelten Zeilen wie gewohnt ein. Wenn jedoch eine doppelte Zeile gefunden wird, wird ein UPDATE für die ursprüngliche Zeile ausgeführt. zum Beispiel:
INSERT INTO my_table (unique_index_column, other_column) VALUES (1, ‚other value‘) ON DUPLICATE KEY UPDATE other_column = ‚doppelter Aktualisierungswert‘;
REPLACE
REPLACE funktioniert genauso wie INSERT, außer dass bei Auftreten einer doppelten Zeile die ursprüngliche Zeile gelöscht und dann mit dem Einfügen fortgefahren wird. Jede Zeile mit einem doppelten eindeutigen Indexwert ersetzt die Zeile, die ursprünglich den Wert enthielt. zum Beispiel:
REPLACE INTO my_table (unique_index_column, other_column) VALUES (1, ‚other value‘)