在PostgreSQL中使用双引号创建表

3
每当我们创建表时,只需在任何数据库系统中指定为CREATE TABLE table_name。当我们在postgre中创建表时,我们使用CREATE TABLE "tabl_name"。在postgreSql中使用双引号" "创建表是否有区别?
3个回答

6
如果您在表名周围使用双引号,则会使名称区分大小写。默认情况下,未引用的表名(以及一般的标识符)不区分大小写。
例如,如果不使用引号使用以下创建语句: CREATE TABLE TestTable... 这意味着可以使用以下所有内容来引用该表: TESTTABLE、testtable、TesTTabLe 而如果在创建语句中使用引号: CREATE TABLE "TestTable"... 那么只能使用“TestTable”来引用此表,其他名称将无法使用。
手册中包含了一个关于这个主题的章节,详细解释了它: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

你确定吗?(大小写敏感性“被保存”作为表模式的一部分。) - user166390
1
这是来自PostgreSQL文档的一句话(在我的回答中提供了链接):引用标识符也会使其区分大小写,而未加引号的名称总是折叠为小写。例如,PostgreSQL认为标识符FOO、foo和"foo"是相同的,但"Foo"和"FOO"与这三个标识符以及彼此不同。 - DB5
正确的做法是让 标识符 区分大小写...但是如果 FOO 是不区分大小写的,那么它应该与可能用于创建表的 "Foo" 匹配,对吗?(我不使用postgres,请注意。) - user166390
不,如果在创建表CREATE TABLE "Foo"...时使用了“Foo”,那么没有引号的 FOO 将无法匹配表名 - 因此 SELECT * FROM FOO 将无法工作。 - DB5
1
@pst:在进行任何操作之前,PostgreSQL会将非引用标识符转换为小写,因此逻辑更像是“如果未引用,则ident = lower(ident),否则保持不变”;这适用于模式中的表名和查询中的标识符,在查询尝试查找表名之前。因此,原始的FOO将在尝试匹配Foo之前变成foo,并且没有任何有用的结果。 - mu is too short

2

如果您只使用小写字母,那么与SQL标准相反,它不会有任何区别。

如果您使用任何没有引号的大写字母,它将被转换为小写字母。

如果您使用任何带引号的大写字母,它将不会被转换,并且您必须始终使用它来访问此表格(或列或任何其他标识符)。

最好不要在标识符中使用引号。


1

实际上有一些不同之处。

双引号告诉解析器所包含的内容是一个区分大小写的标识符,要按字面意义读取。

这导致了许多不同之处。您可以做以下事情:

CREATE TABLE "table" ( ... );

但不是

CREATE TABLE table (...);

它不仅区分大小写(PostgreSQL将未加引号的标识符折叠为小写),而且可以包含其他被禁止的关键字。

这意味着之后您必须使用类似以下的内容:

SELECT * FROM "table"

但你做不到

SELECT * FROM table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接