我有一个 PostgreSQL 数据库表,有 4 列 - 标记为 column_a、column_b 等。我想使用简单的选择查询来查询该表:
select * from table_name;
我得到一些结果,如下所示:
column_a | column_b
---------+---------
'a value'|'b_value'
但是当我使用这个查询时:
select * from schema_name.table_name;
我得到完整的结果:
column_a | column_b | column_c | column_d
---------+----------+----------+---------
'a value'|'b value' |'c value' |'d_value'
Columns c
and d
在初始表创建后稍后添加。我的问题是:当模式名称被排除在选择查询之外时,为什么数据库会忽略后面的列?
表名在 Postgres 的数据库中并不唯一。不同模式中可以有任意数量的名为“table_name”的表 - 包括临时模式,它总是排在第一位,除非您明确地将其列在其他模式之后search_path
。显然,有多个表命名table_name
。你必须了解的角色search_path
正确解释这一点:
- search_path 如何影响标识符解析和“当前模式” https://stackoverflow.com/questions/9067335/how-does-the-search-path-influence-identifier-resolution-and-the-current-schema/9067777#9067777
第一个表存在于之前的模式中schema_name
在你的search_path
(or schema_name
根本没有列出)。因此,不合格的表名被解析为该表(或视图)。检查您的当前角色有权访问数据库中名为“table_name”的表的列表:
SELECT *
FROM information_schema.tables
WHERE table_name = 'table_name';
视图只是附加了一个特殊的表RULE
内部。它们可以起到与常规表相同的作用,并包含在上面的查询中。
细节:
- 如何检查给定模式中是否存在表 https://stackoverflow.com/questions/20582500/how-to-check-if-a-table-exists-in-a-given-schema/24089729#24089729
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)