在Postgres中转义类似关键字的列名

shy*_*cha 122 sql postgresql

如果Postgres表中的列具有名称year,那么应该如何INSERT查询以设置该列的值?

例如:INSERT INTO table (id, name, year) VALUES ( ... );年份字附近给出错误.

NPE*_*NPE 190

只需year用双引号括起来就可以将其解释为关键字:

INSERT INTO table (id, name, "year") VALUES ( ... );
Run Code Online (Sandbox Code Playgroud)

文档:

存在第二种标识符:分隔标识符或带引号的标识符.它是通过用双引号(")括起任意字符序列而形成的.分隔标识符始终是标识符,绝不是关键字.因此,"select"可用于引用名为"select"的列或表,而不带引号的选择将被视为关键字,因此在预期使用表或列名称时会引发解析错误.

  • 一些警告:没有引号PostgreSQL将所有标识符折叠为小写.`MyTable`,`myTable`和`mytable`都是一样的._With_引用此折叠未完成.所以`"MyTable"`与`mytable`不再相同. (43认同)
  • 更好的是,不要使用[保留字](http://www.postgresql.org/docs/current/interactive/sql-keywords-appendix.html)或混合大小写作为标识符,你将永远不必使用双引号或者得到奇怪的错误消息. (19认同)
  • @ErwinBrandstetter问题是当你在一个已建立的项目上工作时. (7认同)
  • @HoàngLong是的.`更新'用户"设置"密码"='值...';`完美无缺... (5认同)
  • @djjeck:http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double-quotes-in-sql (2认同)

May*_*yur 9

如果您未在任何字段/列中提供引号,则 Postgres 默认情况下会将其转为小写。当涉及到列名时,Postgres 将跳过检查关键字。

就您而言,我认为在columns. 但是,如果您使用(由 Postgres 注册)作为 、等的keywords名称,则必须使用双引号,或者可以使用点连接指定模式名称。TableSchemaFunctionTrigger

假设order是Postgres注册的关键字。而且在某些场景下,你必须要用这个关键字作为表名。

那时,Postgres 将允许您使用keywords. 这就是 Postgres 的美妙之处。

要访问订单表,您必须使用双引号,或者可以在表名称之前使用架构名称。

例如

1.

select * from schema_name.order;
Run Code Online (Sandbox Code Playgroud)

2.

select * from "order";
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用这种类型的组合。希望对你有帮助。