我有一个包含4列的PostgreSQL数据库表 - 标记为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'
在创建初始表之后,稍后添加了列c
和d
。我的问题是:当模式名称被排除在选择查询之外时,为什么数据库会忽略后面的列?
答案 0 :(得分:5)
表名在Postgres的数据库中不是唯一的。在不同的模式中可以有任意数量的名为'table_name'的表 - 包括临时模式,除非您在search_path
中的其他模式之后明确列出它,否则它总是首先出现。显然,有多个名为table_name
的表。您必须了解 search_path
的作用才能正确理解这一点:
第一个表位于schema_name
中search_path
之前的架构中(或者schema_name
根本没有列在那里)。因此,非限定表名称将解析为此表(或视图)。检查当前角色可以在数据库中访问的名为“table_name”的表列表:
SELECT *
FROM information_schema.tables
WHERE table_name = 'table_name';
视图只是内部附加RULE
的特殊表。它们可以扮演与常规表相同的角色,并包含在上述查询中。
详细说明: