有人可以告诉我,为什么双引号类型在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
我在文档中找不到任何相关内容。这是一个错误吗? 任何信息将不胜感激
答案 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";
...但很少有。