2010-06-25 14 views
7

Ich arbeite mit etwas Code. Es gibt mehrere Abfragen, deren Auswirkung es ist, dass wenn die Zeile mit einigen der aufgefüllten Daten vorhanden ist, diese Zeile mit dem Rest der Daten aktualisiert wird, und wenn die Zeile nicht existiert, wird eine neue erstellt. Sie sehen wie folgt aus:Wie funktioniert diese SQL-Abfrage, um eine Zeile zu aktualisieren, wenn vorhanden, oder einfügen, wenn nicht, funktioniert?

 
INSERT INTO table_name (col1, col2, col3) 
SELECT %s AS COL1, %s AS COL2, %s AS COL3 
FROM (SELECT %s AS COL1, %s AS COL2, %s AS COL3) A 
LEFT JOIN table_name B 
ON B.COL1 = %s 
AND B.COL2 = %s  --note: doesn't mention all columns here 
WHERE B.id IS NULL 
LIMIT 1 

ich dieses Muster nachahmen kann und es scheint zu funktionieren, aber ich bin verwirrt, was eigentlich hinter den Kulissen. Kann jemand erklären, wie das eigentlich funktioniert? Ich benutze PostgreSQL.

Antwort

3

Sind Sie sicher, dass ist die Aktualisierung Verwenden Sie nur dieses Stück Code?

Was ist Happing ist, dass Sie linken Join mit dem Tabellenname (die Tabelle zum Einfügen neuer Datensätze) und Filtern nur für Zeilen, die nicht in dieser Tabelle vorhanden ist. (WHERE B.id ist NULL)

Ist wie "nicht existiert", nur auf andere Weise.

Ich hoffe, meine Antwort könnte Ihnen helfen.

Grüße.

+0

ah, damit wird ein bereits vorhandener Eintrag nicht aktualisiert? es stellt nur sicher, dass doppelte Zeilen nicht erstellt werden? – Claudiu

+0

Yup, die Where-Klausel dient nur dazu, sicherzustellen, dass es sich nicht um eine Duplizierung handelt. –

+0

ist hier ein Unterschied zu tun dies vs etwas wie: 'INSERT INTO Tabellenname (Spalte1, Spalte2, Spalte3) SELECT% s,% s,% s WHERE NICHT EXISTS (SELECT * FROM Tabellenname als T WHERE T.col1 =% s UND T.col2 =% s) '? – Claudiu

1

Der LINKE VERBINDUNG/IS NULL bedeutet, dass die Abfrage INSERT Datensätze, die nicht bereits vorhanden sind. Das ist in der Tabelle auf der INSERT-Klausel definiert unter der Annahme, ist die gleiche wie die in der Klausel LEFT JOIN - vorsichtig zu abstrahieren ...

Ich bin daran interessiert zu wissen, was %s ist

+0

Ich vermute, das ist die Formatzeichenfolge für eine 'sprintf()' - ähnliche Funktion, und das '% s' wird durch irgendeine Art von Namen oder Wert ersetzt, bevor die SQL an das DBMS gesendet wird. –

+0

yep, die% s sind Daten (Sie können annehmen, dass es "foo", "bar", "baz" für dieses Beispiel ist) in die Tabelle eingefügt werden. – Claudiu