在 Postgres 中避免使用类似关键字的列名

如果 Postgres 表中的列名为 year,那么为该列设置值应该看起来如何?

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

130583 次浏览

只需将 year加上双引号,以免它被解释为 关键词:

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

来自 文件:

还有第二种标识符: 带分隔符的标识符或 带引号的标识符。它是由一个任意的序列 双引号(“)中的字符。带分隔符的标识符始终是 标识符,而不是关键字。因此,“选择”可以用来指代 列或表名为“ select”,而无引号的 select 将为 被当作关键字,因此在以下情况下会引起解析错误 在需要表名或列名时使用。

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

在您的例子中,我不认为在 columns中必须添加引号。 但是如果您使用 keywords(由 Postgres 注册)作为 TableSchemaFunctionTrigger等等的名称,您必须使用双引号,或者您可以使用点连接指定模式名称。

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

到那时,Postgres 将允许你使用 keywords创建一个表格,这就是 Postgres 的魅力所在。

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

脑电图。

1.

select * from schema_name.order;

2.

select * from "order";

同样地,你也可以使用这种组合。希望对你有所帮助。

为了安全起见: 始终引用标识符!为此,必须使用分隔标识符构建插入语句。

SQL2003指定分隔标识符应该用双引号 "引用,如果标识符中出现双引号,则必须复制双引号。见 BNF:

Https://ronsavage.github.io/sql/sql-2003-2.bnf.html#delimited%20identifier

这是引用标识符的 Java 代码:

static String delimited_identifier (String identifier)
{
return "\"" + identifier.replaceAll ("\"", "\"\"") + "\"";
}

这是构建插入的代码:

static String build_insert (String table, String[] columns)
{
StringBuilder sql = new StringBuilder ();
StringBuilder values = new StringBuilder ();


sql.append ("INSERT INTO ");
sql.append (delimited_identifier (table));
sql.append (" (");
int c = 0;
if (columns.length > 0) {
sql.append (delimited_identifier (columns[c]));
values.append ("?");
}
for (++c; c < columns.length; c++) {
sql.append (", ");
sql.append (delimited_identifier (columns[c]));
values.append (", ?");
}
sql.append (") VALUES (");
sql.append (values.toString ());
sql.append (")");


return sql.toString ();
}

例如:

String sql = build_insert ("Person", new String[]{"First name", "Last name"});