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 

?

ufk
quelle

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.

ceejayoz
quelle
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.

Kim
quelle
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 Aziz Al Basyir
quelle
@abdul gibt es MySQL-Unterstützung, was Sie hier erklärt haben?
Lalit Tarsariya