2012-09-16 4 views
10

Ich stieß vor kurzem auf eine Kuriosität. Gilt folgendes SQL:Was bewirkt der output_expression für "DELETE FROM table"?

DELETE FROM customer *; 

Die Dokumentation für PostgreSQL DELETE sagt der Stern ist ein möglicher Wert für den output_expression:

Ein Ausdruck nach durch die DELETE-Befehl berechnet und zurückgeführt werden jede Reihe ist gelöscht. Der Ausdruck kann beliebige Spaltennamen der Tabelle oder Tabelle (n) verwenden, die in USING aufgelistet sind. Schreiben Sie *, um alle Spalten zurückzugeben.

Ich versuchte es mit und ohne den Stern und kann keinen Unterschied sehen. In der Tat kann ich einfach alles nach dem Tabellennamen eingeben und es wird akzeptiert. Es muss nicht einmal ein tatsächlicher Spaltenname sein. Es wird nichts extra zurückgegeben.

db=> DELETE FROM customer wheeeeeee; 
DELETE 19 

Also was macht es und wofür könnte ich es verwenden?

Frage also posted on the PostgreSQL mailing list.

+0

Warum nicht versuchen und herausfinden? –

+0

tat ich. Es löscht nur die Zeilen und gibt nichts Besonderes zurück. –

+4

Sieht so aus, als hättest du 'RETURNING' verpasst, was ein nicht-optionaler Teil der Grammatik ist, die dem' output_expression' vorangeht. Ich nehme an, dass '* 'ohne Alias ​​(wie für' weeeeeeee') behandelt wird. –

Antwort

5

Das Sternchen ist nicht output_expression, dafür müssten Sie das Schlüsselwort RETURNING verwenden. Es handelt sich stattdessen um eine alte, veraltete Syntax zum Einschließen von untergeordneten Tabellen in Abfragen. (Die letzte Version, für die es dokumentiert ist, scheint PostgreSQL 8.1 zu sein. Da die Syntax immer noch gültig ist, ist es ein Dokumentationsfehler, wie Tom Lane in dem Post unten verlinkt.)

Seit PostgreSQL 7.1 ist dies der Standard (es sei denn, sql_inheritance ist deaktiviert und das Schlüsselwort ONLY wird für das Gegenteil verwendet, daher ist das * nicht sehr nützlich.

Siehe this explanatory post from Tom Lane on the PostgreSQL mailing list.