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
?
quelle
INSERT IGNORE
ohne dasON DUPLICATE KEY
Teil, zBINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
WIE IMPLEMENTIEREN 'Einfügen, wenn nicht vorhanden'?
1.
REPLACE INTO
Profis:
Nachteile:
zu langsam.
Die Auto-Inkrement-Taste wird ÄNDERN (um 1 erhöhen), wenn Eintragsübereinstimmungen vorliegen,
unique key
oderprimary key
, da der alte Eintrag gelöscht wird, einen neuen einfügen.2.
INSERT IGNORE
Profis:
Nachteile:
Die Auto-Inkrement-Taste ändert sich nicht, wenn Eintragsübereinstimmungen vorliegen
unique key
oder derprimary key
Auto-Inkrement-Index erhöht sich um 1Einige andere Fehler / Warnungen werden ignoriert, z. B. Datenkonvertierungsfehler.
3.
INSERT ... ON DUPLICATE KEY UPDATE
Profis:
Nachteile:
sieht relativ komplex aus, wenn Sie nur ein Update einfügen möchten.
Die Auto-Inkrement-Taste ändert sich nicht, wenn Eintragsübereinstimmungen vorliegen,
unique key
oder derprimary key
Auto-Inkrement-Index erhöht sich um 14. Jede Möglichkeit, das Erhöhen der Auto-Inkrement-Taste zu stoppen, wenn Eintragsübereinstimmungen vorliegen
unique key
oderprimary key
?Wie im Kommentar von @toien unten erwähnt: "Die automatische Inkrementierungsspalte wird abhängig von der
innodb_autoinc_lock_mode
Konfiguration nach Version 5.1 ausgeführt", wenn Sie sieinnodb
als 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.quelle
innodb_autoinc_lock_mode
Konfiguration nach Version 5.1 ausgeführtVerwenden Sie
ON DUPLICATE KEY UPDATE ...
,Negativ: weil die
UPDATE
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.
quelle