我使用的是Ubuntu和Postgresql 8.4.9.
现在,对于我的数据库中的任何表,如果我从table_name中选择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,"2010-03-18 00:37:55") (3,6,"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;
这是一个已知的混乱的“特征”,有一点点历史.具体来说,您可以使用表名称将表中的元组作为整体引用,然后附加.name将调用它们的名称函数(即将从t中解释为select name(t)).
在Postgresql 9开发的某个时刻,Istr已经清理了一下.您仍然可以从t显式选择t来获取行元组的效果,但是您不能以相同的方式应用函数.所以在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;
产生奇怪的:
name --------- (1,foo) (1 row)
但在9.1.1产生:
ERROR: column t.name does not exist LINE 1: select t.name from t; ^
正如你所料.
所以,要具体回答你的问题:名称是Postgresql中的一个标准类型(在表名称等的目录中使用),还有一些将事物转换为名称类型的标准函数.它实际上并不是保留的,只是存在的对象被称之为加上一些历史奇怪的语法,使事情变得混乱;最近版本由开发人员修复.