这个问题意味着双引号在强制PostgreSQL识别标识符名称大小写时实际上成为标识符名称的一部分。这是不正确的。实际发生的是,如果您使用双引号来强制使用大小写,则必须始终使用双引号引用该标识符。
背景:在PostgreSQL中,标识符名称总是折叠为小写,除非您用双引号括住标识符名称。这可能会导致混淆。
考虑按顺序运行以下两个语句会发生什么:
CREATE TABLE my_table (
t_id serial,
some_value text
);
这将创建一个名为my_table
的表格。
现在,尝试运行以下内容:
CREATE TABLE My_Table (
t_id serial,
some_value text
);
PostgreSQL忽略了大写(因为表名没有被引号包围),并试图创建另一个名为my_table
的表。当这种情况发生时,它会抛出一个错误:
PostgreSQL 忽略了大小写(因为表名没有被引号包围),并尝试创建名为 my_table
的另一张表。当发生这种情况时,它会抛出一个错误:
ERROR: relation "my_table" already exists
要创建一个由大写字母组成的表格,您需要运行以下命令:
要创建一个由大写字母组成的表格,您需要运行以下命令:
CREATE TABLE "My_Table" (
t_id serial,
some_value text
);
现在您的数据库中有两个表:
Schema | Name | Type | Owner
public | My_Table | table | postgres
public | my_table | table | postgres
唯一访问 My_Table
的方法是用双引号括起标识符名称,例如:
SELECT * FROM "My_Table"
如果您将标识符不加引号地离开,则PostgreSQL会将其折叠为小写并查询my_table
。