PostgreSQL双引号

时间:2015-06-03 10:41:16

标签: postgresql

有人可以告诉我,为什么双引号类型在PosqtgreSQL中表现不同?

CREATE TABLE foo1 (pk int4); -- ok
CREATE TABLE foo2 (pk "int4"); -- ok
CREATE TABLE foo3 (pk int); -- ok
CREATE TABLE foo4 (pk "int"); -- fail: type "int" does not exist
CREATE TABLE foo5 (pk integer); -- ok
CREATE TABLE foo6 (pk "integer"); -- fail: type "integer" does not exist

我在文档中找不到任何相关内容。这是一个错误吗? 任何信息将不胜感激

1 个答案:

答案 0 :(得分:1)

双引号表示标识符的解释与写入完全相同。它们会导致保留大小写而不是扁平化,并且它们允许将关键字解释为标识符。

PostgreSQL的int是对integer类型的解析时转换。系统目录中实际上没有任何名为int的数据类型:

regress=> select typname from pg_type where typname = 'int';
 typname 
---------
(0 rows)

它被处理为解析时转换,就像关键字一样。因此,当您通过引用来保护它免受转换时,您会告诉数据库按该名称查找实际类型。

这实际上可以以向后兼容的方式撤消,因为如果他们创建了名为"int"的类型或表格,它会破坏某人的系统。 (类型和表共享相同的命名空间)。

这与user转换为current_user的方式类似。 Rails开发人员经常使用User作为模型名称,这会导致Rails在数据库中尝试SELECT * FROM user;,但这会在解析时转换为SELECT * FROM current_user;,从而导致混淆用户想知道为什么他们的table有一行,其中包含用户名。查询生成器总是引用标识符,即它们应该生成SELECT * FROM "user"; ...但很少有。