PostgreSQL:表名/模式混淆

13

我在我的PostgreSQL数据库的public schema中创建了一个名为Abc的表。根据文档,public应该是默认模式。 search_path已按预期设置为"$user",public。 但是以下操作失败:

select * from Abc

这个调用也失败了:

select * from public.Abc

两者都产生了一个错误,说关系...不存在。但是这个可以正常工作:

select * from public."Abc"

我是一名经验丰富的T-SQL开发人员,但对于PostgreSQL还比较陌生。根据文档,应该可以使用“正常”的SQL语句来操作PostgreSQL数据库。但在我的情况下并不起作用。有没有什么提示可以让我知道自己错在哪里?

3个回答

11

PostgreSQL默认使用小写字符,但对列/表名区分大小写:

select * from public.Abc 

实际上是:

select * from public.abc

那是因为你的表名叫做Abc,所以找不到。

你可以通过使用引号来覆盖这种小写的行为,这样"Abc"会被处理为Abc。


3
在PG世界中,我遵循的一个好的经验法则是使用下划线而不是驼峰命名法,就像你在Microsoft SQL Server中可能会做的那样。因此,使用fast_table代替"FastTable"。我认为最少的额外引号很烦人。虽然其他人可能认为下划线也一样。但我来自Oracle背景,所以我习惯了这种方式。 - Kuberchaun

6

这是正常的,对象名称例如表名和列名在大小写上不区分,除非你将它们用双引号 " 包含起来。这是标准的 SQL 行为。


仅为完整性而言。我是否正确理解SQL标准要求未使用引号的名称应与大写的带引号等效名称相同?换句话说,Abc ≡“ABC” - Grzegorz Szpetkowski
2
据我所知,表名和列名应该规范化为大写,除非加了引号;然而,PostgreSQL会将这些名称转换为小写。 - mu is too short

5

不要相信大小写混合的情况。为了你的心智健康最好永远不要使用大小写混合。 公共模式(大多数情况下)是默认模式,可以省略。


这个建议的原因是,当您的模型被导出到另一个安装程序时,很快就会遇到问题,因为该安装程序具有不同的大小写敏感设置。 - wildplasser

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