为何需用public限定表名、双引号包裹列名?如何解决?
问题原因及解决方法
核心原因
1. 标识符大小写敏感性问题
PostgreSQL对标识符(表名、列名)的处理规则是:
- 未用双引号包裹的标识符会被自动转换为小写;
- 用双引号包裹的标识符会严格保留大小写。
你建表/列时大概率用了带双引号的大小写混合名称(比如CREATE TABLE "Table1" ("Column1" INT)),而讲师的表/列是全小写且未加双引号创建的(CREATE TABLE table1 (column1 INT))。这导致你必须用双引号匹配大小写才能找到对象,而讲师直接写小写即可。
2. 搜索路径优先级问题
你的search_path配置是"$user", public,PostgreSQL会优先查找与当前用户名同名的schema。如果你的用户名恰好和目标表名同名,或者存在同名的空schema,PostgreSQL会优先去这个schema里查找,找不到才会转向public,所以你必须手动加public.指定schema。
解决方法
方法一:统一标识符为小写(推荐)
将带大小写的表和列重命名为全小写,后续无需再用双引号:
-- 重命名表 ALTER TABLE "Table1" RENAME TO table1; -- 重命名列 ALTER TABLE table1 RENAME COLUMN "Column1" TO column1;
之后你就可以像讲师一样编写查询:
SELECT * FROM table1; SELECT column1 FROM table1 WHERE column1 IS NULL;
方法二:调整搜索路径顺序
修改搜索路径,让public优先级高于"$user":
- 临时生效(仅当前会话):
SET search_path TO public, "$user";
- 永久生效(对当前用户):
ALTER USER your_username SET search_path TO public, "$user";
替换your_username为你实际使用的数据库用户名,之后无需手动添加public.前缀。
内容的提问来源于stack exchange,提问作者Madsp
相关产品推荐
相关产品推荐

