PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Le nom est-il un mot-clé spécial dans PostgreSQL ?

Il s'agit d'une "fonctionnalité" déroutante connue avec un peu d'histoire. Plus précisément, vous pouvez faire référence aux tuples de la table dans son ensemble avec le nom de la table, puis ajouter .name invoquerait le name fonction sur eux (c'est-à-dire qu'il serait interprété comme select name(t) from t ).

À un moment donné du développement de PostgreSQL 9, Istr a été un peu nettoyé. Vous pouvez toujours faire select t from t explicitement pour obtenir l'effet rows-as-tuples, mais vous ne pouvez pas appliquer une fonction de la même manière. Donc sur PostgreSQL 8.4.9 , ceci :

create table t(id serial primary key, value text not null);
insert into t(value) values('foo');
select t.name from t;

produit le bizarre :

  name   
---------
 (1,foo)
(1 row)

mais sur 9.1.1 produit :

ERROR:  column t.name does not exist
LINE 1: select t.name from t;
               ^

comme vous vous en doutez.

Donc, pour répondre précisément à votre question :name est un type standard dans PostgreSQL (utilisé dans le catalogue pour les noms de table, etc.) ainsi que certaines fonctions standard pour convertir les choses en name taper. Ce n'est pas réellement réservé, seuls les objets qui existent appelés ainsi, plus une syntaxe historique étrange, ont rendu les choses confuses; et cela a été corrigé par les développeurs dans les versions récentes.