Escaping di nomi di colonne simili a parole chiave in Postgres


134

Se la colonna nella tabella di Postgres ha il nome year, come dovrebbe essere la INSERTquery per impostare il valore per quella colonna?

Ad esempio: INSERT INTO table (id, name, year) VALUES ( ... );dà un errore vicino alla parola dell'anno .

Risposte:


211

Basta racchiuderlo yeartra virgolette doppie per impedire che venga interpretato come una parola chiave :

INSERT INTO table (id, name, "year") VALUES ( ... );

Dalla documentazione :

Esiste un secondo tipo di identificatore: l'identificatore delimitato o l'identificatore citato. È formato racchiudendo una sequenza arbitraria di caratteri tra virgolette ("). Un identificatore delimitato è sempre un identificatore, mai una parola chiave. Quindi" select "può essere utilizzato per fare riferimento a una colonna o una tabella denominata" select ", mentre una selezione non quotata verrebbe presa come parola chiave e provocherebbe quindi un errore di analisi se usata laddove è previsto un nome di tabella o colonna.


44
Qualche avvertimento: senza le virgolette PostgreSQL piega tutti gli identificatori in minuscolo. MyTable, myTableE mytablesono lo stesso. Con le virgolette questa piegatura non è fatta. Quindi "MyTable"non è più lo stesso di mytable.
AH,

19
Meglio ancora, astieniti dall'usare parole riservate o maiuscole e minuscole come identificatori e non dovrai mai usare le doppie virgolette o ricevere strani messaggi di errore.
Erwin Brandstetter,


8
@ErwinBrandstetter Il problema è quando lavori su un progetto stabilito.
ceruleo,

5
@ HoàngLong sì, lo fa. update "user" set "password" = 'value...';funziona perfettamente bene ...
Phill

0

Se non fornisci le virgolette in nessun campo / colonna, per impostazione predefinita sarà minuscolo da Postgres. E Postgres salterà il controllo della parola chiave quando si tratta del nome della colonna.

Nel tuo caso, non credo sia obbligatorio aggiungere citazioni quando si tratta di columns. Ma se si utilizza keywords(registrato da Postgres) come nome di Table, Schema, Functiono Triggerecc, è necessario disporre di utilizzare le virgolette, oppure è possibile specificare il nome schema con dot concatenazione.

Supponiamo che ordine sia la parola chiave registrata da Postgres. E in alcuni scenari, è necessario utilizzare questa parola chiave come nome di tabella.

In quel momento, Postgres ti permetterà di creare una tabella con keywords. Questa è la bellezza di Postgres.

Per accedere alla tabella degli ordini, è necessario utilizzare un preventivo doppio oppure è possibile inserire il nome dello schema prima del nome della tabella.

PER ESEMPIO

1.

select * from schema_name.order;

2.

select * from "order";

Allo stesso modo, puoi usare questo tipo di combinazione. Spero che questo ti possa aiutare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.