PostgreSQL 双引号类型

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

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

最佳答案

双引号意味着标识符将完全按照书面形式进行解释。它们会保留大小写而不是扁平化,并且允许将关键字解释为标识符。

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/

相关文章:

python - Django:在外键上不同,然后排序

c++ - PQprepare 和 PQexecPrepared 用法

sql - 在数据库中查询第 "trim"行

php - 尝试通过 pg_query_params 创建并回显数组

postgresql - 如何加入同一张 table 以获得两天之间的价格差异?

java - 以区分列或类名作为键的 Hibernate 映射

postgresql - pg_restore : [archiver] input file is too short error in postgres

postgresql - 选择与 CASE 不同的选项 - PostgreSQL

c# - 我可以在 Entity Framework Core 中触发连接数据库的事件吗?

postgresql - 数组类型有什么用?