Escapar de nombres de columnas similares a palabras clave en Postgres

134

Si la columna en la tabla de Postgres tiene el nombre year, ¿cómo debería verse la INSERTconsulta para establecer el valor de esa columna?

Por ejemplo: INSERT INTO table (id, name, year) VALUES ( ... );da un error cerca de la palabra del año .

shybovycha
fuente

Respuestas:

211

Simplemente encierre yearentre comillas dobles para evitar que se interprete como una palabra clave :

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

De la documentación :

Hay un segundo tipo de identificador: el identificador delimitado o el identificador entre comillas. Se forma al encerrar una secuencia arbitraria de caracteres entre comillas dobles ("). Un identificador delimitado siempre es un identificador, nunca una palabra clave. Por lo tanto," select "podría usarse para referirse a una columna o tabla llamada" select ", mientras que una selección sin comillas se tomaría como una palabra clave y, por lo tanto, provocaría un error de análisis cuando se usa cuando se espera un nombre de tabla o columna.

NPE
fuente
44
Alguna advertencia: sin las comillas, PostgreSQL dobla todos los identificadores a minúsculas. MyTable, myTabley mytableson lo mismo. Con las comillas este plegado no se realiza. Entonces "MyTable"ya no es lo mismo que mytable.
AH
19
Mejor aún, obstaculice el uso de palabras reservadas o mayúsculas y minúsculas como identificadores y nunca tendrá que usar comillas dobles ni recibir mensajes de error extraños.
Erwin Brandstetter
8
@ErwinBrandstetter El problema es cuando trabajas en un proyecto establecido.
ceruleus
55
@ HoàngLong sí lo hace. update "user" set "password" = 'value...';funciona perfectamente bien ...
Phill
0

Si no proporciona comillas en ningún campo / columna, Postgres lo pondrá en minúscula de forma predeterminada. Y Postgres omitirá la comprobación de la palabra clave cuando se trata del nombre de la columna.

En su caso, no creo que sea obligatorio agregar citas cuando se trata de columns. Pero si está utilizando keywords(registrada por Postgres) como el nombre de Table, Schema, Functiono Triggeretc, que debe tener para utilizar comillas dobles, o puede especificar nombre de esquema con la concatenación de puntos.

Supongamos que orden es la palabra clave registrada por Postgres. Y en algunos escenarios, debe usar esta palabra clave como nombre de tabla.

En ese momento, Postgres te permitirá crear una tabla con keywords. Esa es la belleza de Postgres.

Para acceder a la tabla de pedidos, debe utilizar una comilla doble o puede utilizar el nombre del esquema antes del nombre de la tabla.

P.EJ

1)

select * from schema_name.order;

2)

select * from "order";

Del mismo modo, puede usar este tipo de combinación. Espero que esto te ayudará.

Mayur
fuente