Échapper les noms de colonnes de type mot-clé dans Postgres

134

Si la colonne de la table de Postgres porte le nom year, à quoi doit ressembler la INSERTrequête pour définir la valeur de cette colonne?

Exemple: INSERT INTO table (id, name, year) VALUES ( ... );donne une erreur près du mot de l' année .

shybovycha
la source

Réponses:

211

Mettez simplement yearentre guillemets pour éviter qu'il ne soit interprété comme un mot clé :

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

De la documentation :

Il existe un deuxième type d'identifiant: l'identifiant délimité ou entre guillemets. Il est formé en entourant une séquence arbitraire de caractères entre guillemets ("). Un identifiant délimité est toujours un identifiant, jamais un mot clé. Ainsi," select "pourrait être utilisé pour faire référence à une colonne ou une table nommée" select ", alors qu'une sélection sans guillemets serait considérée comme un mot clé et provoquerait donc une erreur d'analyse lorsqu'elle est utilisée là où un nom de table ou de colonne est attendu.

NPE
la source
44
Un avertissement: sans les guillemets, PostgreSQL plie tous les identifiants en minuscules. MyTable, myTableet mytablesont exactement les mêmes. Avec les guillemets, ce pliage n'est pas fait. Ce "MyTable"n'est donc plus la même chose que mytable.
AH
19
Mieux encore, évitez d'utiliser des mots réservés ou des casse mixte comme identificateurs et vous n'aurez jamais à utiliser les guillemets doubles ni à recevoir d'étranges messages d'erreur.
Erwin Brandstetter
8
@ErwinBrandstetter Le problème survient lorsque vous travaillez sur un projet établi.
ceruleus
5
@ HoàngLong oui c'est le cas. update "user" set "password" = 'value...';fonctionne parfaitement bien ...
Phill
0

Si vous ne fournissez pas de guillemets dans aucun champ / colonne, il sera mis en minuscules par Postgres par défaut. Et Postgres ignorera la vérification du mot-clé en ce qui concerne le nom de la colonne.

Dans votre cas, je ne pense pas qu'il soit obligatoire d'ajouter des guillemets lorsqu'il s'agit de columns. Mais si vous utilisez keywords(enregistré par Postgres) comme nom de Table, Schema, Functionou Triggeretc, vous devez avoir à utiliser soit des guillemets doubles, ou vous pouvez spécifier le nom de schéma avec concaténation de points.

Supposons que l' ordre soit le mot-clé enregistré par Postgres. Et dans certains scénarios, vous devez utiliser ce mot-clé comme nom de table.

À ce moment-là, Postgres vous permettra de créer une table avec keywords. Telle est la beauté de Postgres.

Pour accéder à la table de commande, soit vous devez utiliser un guillemet double, soit vous pouvez vous nom de schéma avant le nom de la table.

PAR EXEMPLE

1.

select * from schema_name.order;

2.

select * from "order";

De même, vous pouvez utiliser ce type de combinaison. J'espère que ceci vous aidera.

Mayur
la source