Postgres中的Schema.Table [重复]

Posted

技术标签:

【中文标题】Postgres中的Schema.Table [重复]【英文标题】:Schema.Table in Postgres [duplicate] 【发布时间】:2020-08-03 16:53:47 【问题描述】:

在 Postgres 中,当我只使用表名运行任何查询时,我收到以下错误:

ERROR:  relation "transactions" does not exist
LINE 2: SELECT * FROM TRANSACTIONS
                      ^
SQL state: 42P01
Character: 16

为了解决这个问题,我需要使用“schema.table”格式——这使得查询非常冗长且笨拙。

SELECT * FROM public."TRANSACTIONS"

我只有 1 个架构 - 公开的。我已经尝试将 search_path 设置为 public,但它没有帮助。有什么建议吗?

【问题讨论】:

【参考方案1】:

您可以设置搜索路径:

SET search_path TO public;

如果它不起作用,请检查设置后的搜索路径:

SHOW search_path;

查看文档:https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATH

还要注意,在 PostgreSQL 中双引号对象名称很重要。也许您的search_path 是正确的,但表是作为双引号 "TRANSACTIONS" 创建的。 PostgreSQL 仅将 未引用 的名称转换为小写(在所有语句中),因此如果您键入 SELECT FROM TRANSACTIONS,它将变为 SELECT FROM transactions,这将正确产生 transactions 关系不存在的错误(仅 @ 987654330@ 确实如此)。您可以通过运行 \dt 来检查 PostgreSQL 看到的表名 - 显示表(这也将证明您的 search_path 设置正确)。

TLDR;除非你有充分的理由,否则你不想双引号。

请参阅此处引用的文档:https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

【讨论】:

我已经尝试设置 search_path。我跑了 show search_path 它说“公共” - 这是正确的。但是当我运行查询时它仍然失败。 @anhtle 我看到了你的评论。某处一定有一些错误,因为 public 只不过是普通的模式。 SHOW search_path;设置后不起作用,能不能把它的输出贴出来? 这是我的结果portfolio=# SHOW search_path; search_path ------------- public (1 row) 看起来不错,现在当您输入\dt 以显示所有表格时,您会得到什么? 我怀疑你的问题不是真正的 search_path 而是使用引号(它们在 PostgreSQL 中具有特殊含义,如果没有引用,则全部转换为小写,所以我猜你的表称为 TRANSACTIONS,因此看不到。 【参考方案2】:

看起来您在使用双引号标识符 (") 时遇到了问题,应尽可能避免这种情况。如果标识符被双引号括起来,则它必须始终被双引号括起来。因此以下语句不同:选择* from TRANSACTIONS; 和 Select * from "TRANSACTIONS";

自公开以来。“TRANSACTIONS”适用于您尝试不使用架构的双引号:

select * from "TRANSACTIONS";

如果可行,请确保始终使用双引号。或者更好的是,在过分深入之前,将其重命名以消除双引号。

【讨论】:

以上是关于Postgres中的Schema.Table [重复]的主要内容,如果未能解决你的问题,请参考以下文章

表中的更改列在 postgres 中具有枚举类型

Postgres 中的动态 SQL

我如何将Postgres DDL转储到可粘贴到Google表格中的CSV中?

postgres 中的行级安全性 (RLS) 性能明显较慢。

删除具有特权的角色

Postgres 更新不使用主键索引