0

在 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,但它没有帮助。有什么建议吗?

4

2 回答 2

0

您可以设置搜索路径:

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关系不存在的错误(仅TRANSACTIONS存在)。您可以通过运行\dt- display tables 检查 PostgreSQL 所看到的表名(这也将证明您search_path的设置正确)。

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

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

于 2020-04-21T02:46:13.527 回答
0

看起来您在使用双引号标识符 (") 时遇到问题,应尽可能避免。如果标识符被双引号,则必须始终双引号。因此以下语句不一样: Select * from TRANSACTIONS ; 并从“交易”中选择 *;

由于 public."TRANSACTIONS" 适用于您尝试不使用架构的双引号:

select * from "TRANSACTIONS";

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

于 2020-04-21T03:42:36.770 回答