2012-09-16 10 views
10

Recentemente ho trovato una stranezza. Quello che segue è SQL valida:Cosa fa l'output_expression per "DELETE FROM table"?

DELETE FROM customer *; 

La documentazione per PostgreSQL DELETE dice la stella è un possibile valore per il output_expression:

Un'espressione da calcolare e restituito dal comando Elimina dopo ogni riga è cancellato. L'espressione può utilizzare qualsiasi nome di colonna della tabella o delle tabelle elencate in USING. Scrivi * per restituire tutte le colonne.

Ho provato con e senza la stella e non vedo la differenza. In effetti, posso mettere qualsiasi parola singola dopo il nome del tavolo ed è accettata. Non deve nemmeno essere un nome di colonna reale. Non viene restituito altro extra.

db=> DELETE FROM customer wheeeeeee; 
DELETE 19 

Quindi cosa fa e cosa posso usare?

Domanda also posted on the PostgreSQL mailing list.

+0

Perché non provarlo e scoprirlo? –

+0

L'ho fatto. Elimina solo le righe e non restituisce nulla di speciale. –

+4

Sembra che tu abbia mancato il 'RETURNING' che è una parte non opzionale della grammatica che precede' output_expression' Suppongo che '*' sia trattato come un alias (come per 'wheeeeeee') senza quello. –

risposta

5

L'asterisco è non output_expression, per questo è necessario utilizzare la parola chiave RETURNING. È invece una sintassi vecchia e obsoleta per includere tabelle child nelle query. (L'ultima versione per cui è documentata sembra essere PostgreSQL 8.1. Poiché la sintassi è ancora valida è un bug di documentazione, come sottolinea Tom Lane nel post collegato sotto.)

Da PostgreSQL 7.1 questo è il valore predefinito (a meno che sql_inheritance sia disattivato) e la parola chiave ONLY sia utilizzata per l'opposto, quindi * non è molto utile.

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

Problemi correlati