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

时间:2011-12-07 13:24:25

标签: 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;

2 个答案:

答案 0 :(得分: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;

产生奇怪的:

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

9.1.1 会产生:

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

正如您所料。

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

答案 1 :(得分:3)

根据the PostgreSQL documentationname是PostgreSQL,SQL:2003,SQL:1999或SQL-92中的“非保留”关键字。

  

SQL区分保留和非保留关键字。根据标准,保留关键词是唯一真正的关键词;永远不允许他们作为标识符。非保留关键字在特定上下文中仅具有特殊含义,并且可以在其他上下文中用作标识符。大多数非保留关键字实际上是SQL指定的内置表和函数的名称。非保留关键词的概念基本上只存在于声明在某些上下文中某些预定义含义附加到单词上。

使用关键字时的建议修正是:

  

作为一般规则,如果您为包含任何列出的关键字作为标识符的命令获得虚假解析器错误,您应该尝试引用标识符以查看问题是否消失。