Duplizieren und Ignorieren bei MySQL-Inserts
MySQL-Tabellenprimärschlüssel und eindeutige Indizes verhindern, dass der Tabelle mehrere Zeilen mit demselben Index hinzugefügt werden. Wenn Sie versuchen, eine doppelte Zeile mit einer INSERT-Standardanweisung einzufügen, wird ein Fehler angezeigt, und die Einfügung schlägt fehl.
MySQL bietet mehrere Alternativen zur INSERT-Standardanweisung, und jede behandelt doppelte Zeilen etwas anders: "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, so dass jede Zeile durch ihren Primärschlüssel oder den Wert in den UNIQUE-Indexeinschränkungsspalten identifiziert werden kann.
Wenn ein normaler INSERT versucht, eine Zeile einzufügen, die einen doppelten Wert im Primärschlüssel- oder UNIQUE-Integritätsindex enthält, schlägt die Einfügung fehl, und möglicherweise wird die gesamte Transaktion rückgängig gemacht.
INSERT IGNORE
INSERT IGNORE fügt Zeilen auf dieselbe Weise wie INSERT ein, mit der Ausnahme, dass Zeilen mit doppelten Werten ignoriert werden und die Ausführung fortgesetzt wird, ohne einen Fehler zu erzeugen. Zeilen, die einen doppelten Wert enthalten, werden 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 duplizierten Zeilen wie gewohnt ein. Wenn es jedoch auf eine doppelte Zeile trifft, führt es ein UPDATE für die ursprüngliche Zeile aus. zum Beispiel:
INSERT INTO my_table (unique_index_column, other_column) VALUES (1, 'anderer Wert') ON DUPLICATE KEY UPDATE other_column = 'Aktualisierungswert duplizieren';
ERSETZEN
REPLACE funktioniert genauso wie INSERT, löscht jedoch bei einer doppelten Zeile die ursprüngliche Zeile und fährt dann mit der Einfügung fort. Jede Zeile mit einem doppelten eindeutigen Indexwert ersetzt die Zeile, die den Wert ursprünglich enthielt. zum Beispiel:
REPLACE INTO my_table (unique_index_column, other_column) VALUES (1, 'anderer Wert')