谁能告诉我,为什么双引号类型在 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
我在文档中找不到任何有关它的信息。这是一个错误吗? 任何信息将不胜感激
最佳答案
双引号意味着标识符将完全按照书面形式进行解释。它们会保留大小写而不是扁平化,并且允许将关键字解释为标识符。
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;
,让困惑的用户想知道为什么他们的表中有一行包含他们的用户名。查询生成器应该始终引用标识符,即它们应该生成SELECT * FROM "user";
...但很少有人这样做。
关于PostgreSQL 双引号类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30617764/