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

14 浏览
0 Comments

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

如果Postgres表中的列名为year,如何设置该列的值的INSERT查询应该是什么样的?

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

0
0 Comments

在Postgres中,有时候会遇到需要转义类似关键字的列名的情况。下面是解决这个问题的原因和方法。

为了安全起见,我们应该始终引用标识符。为此,必须使用带引号的标识符构建插入语句。

SQL 2003规定,带引号的标识符应该用双引号 " 引用,如果标识符中包含双引号,则必须重复双引号。以下是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"});

在这个问题中,没有必要区分两种情况。只需引用每个标识符即可。几乎不可能知道所有数据库的所有保留字。所以应该使用正确的字符引用,即双引号 ("")。MySQL通过使用反引号 (`) 违反了SQL标准。我的答案涵盖了正确的引号方式。

我不确定是否理解你的问题。你希望我将评论移到答案中吗?

如果将Java代码用于这个问题,不仅没有用,而且是可怕的...

0
0 Comments

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

在您的情况下,我认为在列名中添加引号是没有必要的。

但是,如果您使用的是Postgres注册的关键字作为表名、模式名、函数名或触发器名等,您必须使用双引号,或者可以使用模式名和点连接。

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

这时,Postgres允许您创建一个带有关键字的表。这就是Postgres的优点所在。

要访问order表,您可以使用双引号,或者在表名之前使用模式名。

例如:

1.

select * from schema_name.order;

2.

select * from "order";

同样,您可以使用这种组合方式。希望对您有所帮助。

0
0 Comments

在Postgres中,出现了以关键字命名的列名不能正确解析的问题。解决方法是将列名用双引号括起来,以防止其被解析为关键字。如果不加双引号,PostgreSQL会将所有标识符转换为小写。另外,最好避免使用保留字或混合大小写作为标识符,这样就不需要使用双引号或遇到奇怪的错误信息。此外,一些用户以为SELECT "year"会返回字符串year,但实际上这是MySQL的行为。最好不要使用保留字,但在已有项目中可能会遇到问题,此时可以使用双引号解决。

0