名称是PostgreSQL中的特殊关键字吗?

SKR*_*SKR 14 postgresql

我正在使用Ubuntu和PostgreSql 8.4.9.

现在,对于我的数据库中的任何表,如果我这样做select table_name.name from table_name,它会显示每行的连续列的结果,尽管name表中没有任何列.对于具有名称列的表,没有问题.知道为什么吗?

我的结果是这样的:

select taggings.name from taggings limit 3;

---------------------------------------------------------------
 (1,4,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
 (2,5,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
 (3,6,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55")
(3 rows)


select name from taggings limit 3;
ERROR:  column "name" does not exist
LINE 1: select name from taggings limit 3;
Run Code Online (Sandbox Code Playgroud)

ara*_*nid 21

这是一个众所周知的令人困惑的"特征",有一点历史.具体来说,您可以使用表名从表中引用元组作为一个整体,然后追加.name将调用name它们上的函数(即它将被解释为select name(t) from t).

在PostgreSQL 9开发的某些时候,Istr这个被清理了一下.您仍然可以select t from t显式地获取row-as-tuples效果,但是您不能以相同的方式应用函数.所以在PostgreSQL 8.4.9上,这个:

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

产生奇怪的:

  name   
---------
 (1,foo)
(1 row)
Run Code Online (Sandbox Code Playgroud)

但在9.1.1产生:

ERROR:  column t.name does not exist
LINE 1: select t.name from t;
               ^
Run Code Online (Sandbox Code Playgroud)

正如你所料.

所以,要专门回答你的问题:name是PostgreSQL中的标准类型(在目录中用于表名​​等),还有一些将事物转换为name类型的标准函数.它实际上并没有被保留,只是存在的对象被称为,加上一些历史奇怪的语法,让事情变得混乱; 这已由最近版本的开发人员修复.