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 DDL转储到可粘贴到Google表格中的CSV中?