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


134

如果Postgres表中的列名为name year,应如何INSERT查询以设置该列的值?

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

Answers:


211

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

INSERT INTO table (id, name, "year") VALUES ( ... );

文档中

还有第二种标识符:定界标识符或带引号的标识符。它是通过将任意字符序列括在双引号(“)中形成的。定界的标识符始终是标识符,而不是关键字。因此,” select“可用于引用名为” select“的列或表,而未加引号的选择将作为关键字,因此在需要表或列名称的地方使用时会引发解析错误。


44
警告:如果没有引号,PostgreSQL会将所有标识符折叠成小写。MyTablemyTable并且mytable是一样的。使用引号不会完成此折叠。因此"MyTable"不再与相同mytable
AH

19
更好的是,不要使用保留字或大小写混合的标识符,并且您将永远不必使用双引号或得到奇怪的错误消息。
Erwin Brandstetter,


8
@ErwinBrandstetter问题是当您处理已建立的项目时。
ceruleus

5
@HoàngLong是的。update "user" set "password" = 'value...';效果很好...
Phill

0

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

就您而言,我不认为在时必须添加引号columns。但是,如果您使用keywords(由Postgres注册)作为,或等的名称Table,则必须使用双引号,或者可以使用点串联来指定架构名称。SchemaFunctionTrigger

假设,order是Postgres注册的关键字。在某些情况下,您必须必须使用此关键字作为表名。

那时,Postgres将允许您使用创建表keywords。那就是Postgres的美丽。

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

例如

1。

select * from schema_name.order;

2。

select * from "order";

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.