2011-08-31 68 views
12

我在我的postgresql数据库的公共架构中创建了一个表Abc。根据文档public应该是默认模式。如预期的那样,search_path设置为"$user",public。但以下故障:Postgresql:表名/模式混淆

select * from Abc 

这个调用失败过:

select * from public.Abc 

两个产生一个错误,指出relation ... does not exist。但这一个工作正常:

select * from public."Abc" 

我是一个经验丰富的T-SQL开发人员,但新的postgresql。根据文档,应该可以将“正常”的SQL与postgresql结合使用。但这对我来说不起作用。任何暗示我可能已经搞砸了!?

回答

9

PostgreSQL的默认为小写字母,同时区分大小写与列/表名:

select * from public.Abc 

居然是:

select * from public.abc 

那是因为你的表名为ABC,所以它不能被发现

您可以通过引号来覆盖此小写行为,因此“Abc”作为Abc处理。

+3

我在PG世界中生活的一个很好的经验法则是使用下划线而不是像在Microsoft SQL Server中那样使用骆驼案例。所以做fast_table而不是“FastTable”。我发现最低限度的额外报价令人讨厌。尽管其他人可能会认为下划线是一样的。但是我来自Oracle背景,所以我很喜欢它。 – Kuberchaun

5

不要信任混合大小写。最好的理由是从不使用混合大小写。 公共架构(大部分)是默认架构,可以省略。

+0

此建议的原因在于,当您的模型导出到另一个安装时,您很快遇到问题,其他设置的case(in)灵敏度也会出现问题。 – wildplasser

6

这是正常的,如表和列对象名称是区分大小写的,除非你把它们放在双引号”之间,这是标准的SQL行为。

+0

只是为了完整。我是否正确,SQL标准要求不带引号的名称应该与**大写**引用等同的行为相同?换句话说'Abc≡“ABC”'? –

+2

@Grzegorz:除非有引用,否则AFAIK,表名和列名应被标准化为大写字母; PostgreSQL,OTOH将名称转换为小写。 –