Schema.Table 在 Postgres 中

Schema.Table in Postgres

在 Postgres 中,当我 运行 任何仅使用 table 名称的查询时,我收到以下错误:

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

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

SELECT * FROM public."TRANSACTIONS"

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

您可以设置搜索路径:

SET search_path TO public;

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

SHOW search_path;

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

另请注意,在 PostgreSQL 中双引号对象名称很重要。也许您的 search_path 是正确的,但 table 被创建为 双引号 "TRANSACTIONS"。 PostgreSQL 仅将 unquoted 名称转换为小写(在所有语句中),因此如果您键入 SELECT FROM TRANSACTIONS 它将变为 SELECT FROM transactions 这将正确产生 transactions 关系不存在(只有 TRANSACTIONS 存在)。您可以通过 运行 \dt 检查您的 table 名称,如 PostgreSQL 所见 - 显示 tables(这也将证明您的 search_path 设置正确)。

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

在此处查看有关引用的文档:https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

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

因为 public."TRANSACTIONS" 适合您尝试在没有模式的情况下使用双引号:

select * from "TRANSACTIONS";

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