it-swarm.com.de

Bedingtes INSERT mit SQL?

Ich habe eine Datenbank, die von Zeit zu Zeit mit Datensätzen aktualisiert wird. Hier kann es vorkommen, dass ein Datensatz geliefert wird, der bereits in der Datenbank vorhanden ist.

Momentan mache ich zuerst einen

SELECT FROM ... WHERE val1=... AND val2=...

zu überprüfen, ob bereits ein Datensatz mit diesen Daten vorhanden ist (anhand der Daten in der WHERE-Anweisung). Wenn dies keinen Wert zurückgibt, mache ich mein INSERT.

Dies scheint mir jedoch etwas kompliziert zu sein. Meine Frage: Gibt es eine Art bedingter INSERT, der einen neuen Datensatz nur dann hinzufügt, wenn er nicht existiert?

Ich benutze SmallSQL

17
Elmi

Sie können dies mit einer einzigen Anweisung und einer Unterabfrage in fast allen relationalen Datenbanken tun.

INSERT INTO targetTable(field1) 
SELECT field1
FROM myTable
WHERE NOT(field1 IN (SELECT field1 FROM targetTable))

In bestimmten relationalen Datenbanken wurde die Syntax für das Vorstehende verbessert, da das, was Sie beschreiben, eine ziemlich häufige Aufgabe ist. SQL Server verfügt über eine MERGE-Syntax mit allen möglichen Optionen, und MySQL verfügt über die optionale INSERT OR IGNORE-Syntax.

Edit:SmallSQLs Dokumentation ist ziemlich sparsam, welche Teile des SQL-Standards implementiert werden. Es werden möglicherweise keine Unterabfragen implementiert. Daher können Sie möglicherweise den oben genannten Ratschlägen oder anderen Anweisungen nicht folgen, wenn Sie bei SmallSQL bleiben möchten. 

24
DougM

Ich kenne SmallSQL nicht, aber das funktioniert für MSSQL:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

Basierend auf der Where-Bedingung wird die Zeile, falls vorhanden, aktualisiert, ansonsten wird eine neue eingefügt.

Ich hoffe, das war es, wonach du gesucht hast.

12
Fabian Bigler

Es ist möglich mitEXISTScondition. WHERE EXISTS prüft, ob Datensätze in einer Unterabfrage vorhanden sind. EXISTS gibt true zurück, wenn die Unterabfrage einen oder mehrere Datensätze zurückgibt. Hier ist ein Beispiel

UPDATE  TABLE_NAME 
SET val1=arg1 , val2=arg2
WHERE NOT EXISTS
    (SELECT FROM TABLE_NAME WHERE val1=arg1 AND val2=arg2)
1
TMtech

Normalerweise machen Sie die Sache, von der Sie nicht möchten, dass Duplikate eindeutig sind, und erlauben der Datenbank selbst, das Einfügen abzulehnen.

Ansonsten können Sie INSERT INTO verwenden, siehe Wie vermeide ich Duplikate in der INSERT INTO SELECT-Abfrage in SQL Server?

0
ZhiHeather

Wenn Sie nach einem "Upsert" suchen, ist eine der effizientesten Methoden, die derzeit in SQL Server für einzelne Zeilen verfügbar sind, folgende:

UPDATE myTable ...


IF @@ROWCOUNT=0
    INSERT INTO myTable ....

Sie können auch die MERGE-Syntax verwenden, wenn Sie dies mit Datensätzen statt mit einzelnen Zeilen tun.

Wenn Sie INSERT und nicht UPDATE möchten, können Sie einfach Ihre einzelne INSERT-Anweisung schreiben und WHERE NOT EXISTS (SELECT ...) verwenden.

0
Matthew