INSERT… ON DUPLICATE KEY (nichts tun)


184

Ich habe eine Tabelle mit einem eindeutigen Schlüssel für zwei Spalten:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Ich möchte eine Zeile in diese Tabelle einfügen, aber wenn der Schlüssel vorhanden ist, nichts tun! Ich möchte nicht, dass ein Fehler generiert wird, da die Schlüssel vorhanden sind.

Ich weiß, dass es die folgende Syntax gibt:

INSERT ... ON DUPLICATE KEY UPDATE ...

aber gibt es so etwas wie:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

Antworten:


331

Ja, verwenden Sie INSERT ... ON DUPLICATE KEY UPDATE id=id(es wird keine Zeilenaktualisierung auslösen, obwohl ides sich selbst zugewiesen ist).

Wenn Sie sich nicht für Fehler (Konvertierungsfehler, Fremdschlüsselfehler) und die Erschöpfung des Felds für die automatische Inkrementierung interessieren (diese wird erhöht, auch wenn die Zeile aufgrund eines doppelten Schlüssels nicht eingefügt wird), verwenden Sie INSERT IGNORE.


5
Nur um IGNORE nach dem INSERT hinzuzufügen, ist der Rest der Syntax dieselbe?
Ufk

25
@ufk: INSERT IGNOREohne das ON DUPLICATE KEYTeil, zBINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock

125
Beachten Sie, dass INSERT IGNORE auch andere Fehler wie Datenkonvertierungsfehler ignoriert.
mjcopple

36
Also werde ich ON DUPLICATE KEY UPDATE verwenden. id = id. Ich möchte nur Schlüssel-Duplikate ignorieren, keine andere Art von Fehler.
Ufk

7
Vorsicht INSERT IGNORE erhöht die Spalte für die automatische Inkrementierung, auch wenn die Zeile nicht eingefügt ist
WorM

9

WIE IMPLEMENTIEREN 'Einfügen, wenn nicht vorhanden'?

1. REPLACE INTO

Profis:

  1. einfach.

Nachteile:

  1. zu langsam.

  2. Die Auto-Inkrement-Taste wird ÄNDERN (um 1 erhöhen), wenn Eintragsübereinstimmungen vorliegen, unique keyoder primary key, da der alte Eintrag gelöscht wird, einen neuen einfügen.

2. INSERT IGNORE

Profis:

  1. einfach.

Nachteile:

  1. Die Auto-Inkrement-Taste ändert sich nicht, wenn Eintragsübereinstimmungen vorliegen unique keyoder der primary keyAuto-Inkrement-Index erhöht sich um 1

  2. Einige andere Fehler / Warnungen werden ignoriert, z. B. Datenkonvertierungsfehler.

3. INSERT ... ON DUPLICATE KEY UPDATE

Profis:

  1. Damit können Sie einfach die Funktion 'Speichern oder Aktualisieren' implementieren

Nachteile:

  1. sieht relativ komplex aus, wenn Sie nur ein Update einfügen möchten.

  2. Die Auto-Inkrement-Taste ändert sich nicht, wenn Eintragsübereinstimmungen vorliegen, unique keyoder der primary keyAuto-Inkrement-Index erhöht sich um 1

4. Jede Möglichkeit, das Erhöhen der Auto-Inkrement-Taste zu stoppen, wenn Eintragsübereinstimmungen vorliegen unique key oder primary key?

Wie im Kommentar von @toien unten erwähnt: "Die automatische Inkrementierungsspalte wird abhängig von der innodb_autoinc_lock_modeKonfiguration nach Version 5.1 ausgeführt", wenn Sie sie innodbals Engine verwenden. Dies wirkt sich jedoch auch auf die Parallelität aus. Daher muss sie vor der Verwendung sorgfältig berücksichtigt werden. Bisher sehe ich keine bessere Lösung.


Die automatische Inkrementierungsspalte wird abhängig von der innodb_autoinc_lock_modeKonfiguration nach Version 5.1 ausgeführt
toien

1

Verwenden Sie ON DUPLICATE KEY UPDATE ...,
Negativ: weil dieUPDATE Ressourcen für die zweite Aktion verwendet.

Verwendung INSERT IGNORE ...,
negativ: MySQL zeigt keine Fehler an, wenn etwas schief geht, sodass Sie die Fehler nicht behandeln können. Verwenden Sie es nur, wenn Sie sich nicht für die Abfrage interessieren.


@abdul gibt es MySQL-Unterstützung, was Sie hier erklärt haben?
Lalit Tarsariya
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.