it-swarm.com.de

Immer mit SELECT vor INSERT prüfen?

Wenn ich nur dann eine Zeile INSERT möchte, wenn der Primärschlüssel noch nicht vorhanden ist, ist es effizienter/einfacher, INSERT direkt auszuführen und den Fehler bei Duplizierung zu ignorieren oder sollte Ich führe immer SELECT aus, um zu überprüfen, ob es bereits zuerst existiert.

6
James

Sie können WHERE NOT EXISTS verwenden, um neue Werte zu überprüfen, bevor Sie einen neuen Datensatz einfügen.

INSERT INTO <table>
(
    field1, field2, field3
)
SELECT value1, value2, value3
FROM dual
WHERE NOT EXISTS (SELECT 1
                  FROM <table>
                  WHERE <pk fields> = <new values>);
CREATE TABLE foo(id int, v1 int, v2 int);
INSERT INTO foo VALUES (1, 100,100);
INSERT INTO foo VALUES (2, 200, 200);

Dieser Datensatz existiert und sollte nicht eingefügt werden:

INSERT INTO foo (id, v1, v2)
SELECT 1, 101, 101
FROM   dual
WHERE NOT EXISTS (SELECT 1 FROM foo WHERE id=1);

Dies ist ein neuer Rekord:

INSERT INTO foo (id, v1, v2)
SELECT 3, 300, 300
FROM   dual
WHERE NOT EXISTS (SELECT 1 FROM foo WHERE id=3);

Das Endergebnis:

SELECT * FROM foo;
 Id | v1 | v2 
 -: | -: | -: 
 1 | 100 | 100 
 2 | 200 | 200 
 3 | 300 | 300 

dbfiddle hier

4
McNets

Die beste (effizientere Option) hängt von der erwarteten Wahrscheinlichkeit einer PK-Kollision ab.

Wenn die Wahrscheinlichkeit einer Kollision hoch ist, würde ich den DML-Overhead speichern und das SELECT zuerst vor dem potenziellen INSERT ausführen.

Wenn die Wahrscheinlichkeit einer Kollision selten ist, reicht es wahrscheinlich aus, einen INSERT IGNORE Zu erstellen.

Hinweis: Wenn die PK ein auto_increment Ist, kann ein fehlgeschlagener INSERT IGNORE Möglicherweise den auto_increment Aufblasen (siehe innodb_autoinc_lock_mode für variable Optionen).

2
Riedsio

Normalerweise ist IODKU der bessere Weg:

INSERT INTO tbl ...
    ON DUPLICATE KEY UPDATE 
        ....

https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

1
Rick James