Postgresql:表名/模式混淆

Ach*_*him 13 sql postgresql

我在Abcpostgresql数据库的公共模式中创建了一个表.根据文档public应该是默认架构.search_path设置"$user",public为预期.但是以下失败了:

select * from Abc
Run Code Online (Sandbox Code Playgroud)

这个电话也失败了:

select * from public.Abc
Run Code Online (Sandbox Code Playgroud)

两者都产生错误说relation ... does not exist.但这个工作正常:

select * from public."Abc"
Run Code Online (Sandbox Code Playgroud)

我是一位经验丰富的T-SQL开发人员,但对postgresql很新.根据文档,应该可以使用postgresql的"普通"SQL.但它在我的情况下不起作用.什么暗示我可能搞砸了!?

Max*_*xem 10

Postgresql默认使用小写字符,而对列/表名称区分大小写:

select * from public.Abc 
Run Code Online (Sandbox Code Playgroud)

实际上是:

select * from public.abc
Run Code Online (Sandbox Code Playgroud)

那是因为你的表叫做Abc,所以无法找到它.

您可以通过引号覆盖此小写行为,因此"Abc"将作为Abc处理.

  • 我在PG世界中生活的一个好的经验法则是使用下划线而不是像在Microsoft SQL Server中那样的驼峰案例.所以请使用fast_table而不是"FastTable".我发现额外的报价至少令人讨厌.虽然其他人可能会发现下划线是相同的.但我来自Oracle背景,所以我习惯了. (3认同)

Fra*_*ens 6

这是正常的,对象名称(如表和列)不区分大小写,除非您将它们放在双引号之间".这是标准的SQL行为.

  • @Grzegorz:AFAIK,表和列名称应该被标准化为大写,除非引用; PostgreSQL,OTOH,将名称转换为小写. (2认同)

wil*_*ser 5

不要相信混合案例.最好的理智是永远不要使用混合情况.公共模式(大部分)是默认模式,可以省略.