Postgres 列或 table 名称何时需要引号,何时不需要?
When do Postgres column or table names need quotes and when don't they?
让我们考虑以下 postgres 查询:
SELECT *
FROM "MY_TABLE"
WHERE "bool_var"=FALSE
AND "str_var"='something';
当我删除 "str_var"
周围的引号时,查询无法正确响应,但当我在 "bool_var"
周围删除引号时,查询无法正确响应。为什么?在这种情况下,编写查询的正确方法是什么,布尔列周围没有引号,文本列周围没有引号?还有别的吗?
PostgreSQL 将所有名称(table 名称、列名称等)转换为小写,如果您不通过在 create table "My_Table_ABC" ( "My_Very_Upper_and_Lowercasy_Column" numeric,...)
中双引号来阻止它们的话。如果你有这样的名字,你必须始终在选择和其他引用中用双引号引用这些名字。
我建议不要像这样创建 table,也不要在 a-z
、0-9
和 _
之外使用字符。您不能保证针对您的数据库使用的每个软件、库等都支持区分大小写。记住并执行此双引号也很乏味。
感谢@TimBiegeleisen 的评论,我能够查明问题;我使用保留关键字 ("user") 作为列名。
Link 到文档中的保留关键字:https://www.postgresql.org/docs/current/sql-keywords-appendix.html.
现在我知道不能用引号来查询列名,而是要避免保留关键字作为列名。
让我们考虑以下 postgres 查询:
SELECT *
FROM "MY_TABLE"
WHERE "bool_var"=FALSE
AND "str_var"='something';
当我删除 "str_var"
周围的引号时,查询无法正确响应,但当我在 "bool_var"
周围删除引号时,查询无法正确响应。为什么?在这种情况下,编写查询的正确方法是什么,布尔列周围没有引号,文本列周围没有引号?还有别的吗?
PostgreSQL 将所有名称(table 名称、列名称等)转换为小写,如果您不通过在 create table "My_Table_ABC" ( "My_Very_Upper_and_Lowercasy_Column" numeric,...)
中双引号来阻止它们的话。如果你有这样的名字,你必须始终在选择和其他引用中用双引号引用这些名字。
我建议不要像这样创建 table,也不要在 a-z
、0-9
和 _
之外使用字符。您不能保证针对您的数据库使用的每个软件、库等都支持区分大小写。记住并执行此双引号也很乏味。
感谢@TimBiegeleisen 的评论,我能够查明问题;我使用保留关键字 ("user") 作为列名。
Link 到文档中的保留关键字:https://www.postgresql.org/docs/current/sql-keywords-appendix.html.
现在我知道不能用引号来查询列名,而是要避免保留关键字作为列名。