Escapando nomes de colunas semelhantes a palavras-chave no Postgres

134

Se a coluna da tabela do Postgres tiver o nome year, como deve ser a INSERTconsulta para definir o valor dessa coluna?

Por exemplo: INSERT INTO table (id, name, year) VALUES ( ... );dá um erro próximo à palavra do ano .

shybovycha
fonte

Respostas:

211

Simplesmente coloque yearaspas duplas para impedir que seja interpretada como uma palavra - chave :

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

A partir da documentação :

Existe um segundo tipo de identificador: o identificador delimitado ou identificador entre aspas. É formado colocando-se uma sequência arbitrária de caracteres entre aspas duplas ("). Um identificador delimitado é sempre um identificador, nunca uma palavra-chave. Portanto," select "poderia ser usado para se referir a uma coluna ou tabela chamada" select ", enquanto que uma seleção não cotada seria usada como uma palavra-chave e, portanto, provocaria um erro de análise quando usada onde um nome de tabela ou coluna é esperado.

NPE
fonte
44
Um aviso: sem as aspas, o PostgreSQL dobra todos os identificadores para minúsculas. MyTable, myTableE mytablesão a mesma coisa. Com as aspas, essa dobra não é feita. Então "MyTable"não é mais o mesmo que mytable.
AH
19
Melhor ainda, evite usar palavras reservadas ou letras maiúsculas e minúsculas como identificadores e você nunca precisará usar aspas duplas ou receber mensagens de erro estranhas.
Erwin Brandstetter
8
@ErwinBrandstetter O problema é quando você trabalha em um projeto estabelecido.
ceruleus
5
@ HoàngLong sim, faz. update "user" set "password" = 'value...';funciona perfeitamente bem ...
Phill
0

Se você não estiver fornecendo cotações em nenhum campo / coluna, ele será minúsculo pelo Postgres por padrão. E o Postgres pulará a verificação da palavra-chave quando se trata do nome da coluna.

No seu caso, não acho obrigatório adicionar aspas no que diz respeito ao columns. Mas se você estiver usando keywords(registrado pelo Postgres) como o nome Table, Schema, Functionou Triggeretc., você deve ter para usar aspas duplas, quer, ou você pode especificar o nome do esquema com concatenação de ponto.

Vamos supor, order é a palavra-chave registrada pelo Postgres. E em alguns cenários, você deve usar essa palavra-chave como um nome de tabela.

Nesse momento, o Postgres permitirá que você crie uma tabela com keywords. Essa é a beleza do Postgres.

Para acessar a tabela de pedidos, é necessário usar aspas duplas ou o nome do esquema antes do nome da tabela.

POR EXEMPLO

1

select * from schema_name.order;

2)

select * from "order";

Da mesma forma, você pode usar esse tipo de combinação. Espero que isso ajude você.

Mayur
fonte