为什么PostgreSQL SELECT查询在指定模式名称时会返回不同的结果?

时间:2015-05-11 23:05:54

标签: postgresql database-schema postgresql-9.2 database-permissions search-path

我有一个包含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' 

在创建初始表之后,稍后添加了列cd。我的问题是:当模式名称被排除在选择查询之外时,为什么数据库会忽略后面的列?

1 个答案:

答案 0 :(得分:5)

表名在Postgres的数据库中不是唯一的。在不同的模式中可以有任意数量的名为'table_name'的表 - 包括临时模式,除非您在search_path中的其他模式之后明确列出它,否则它总是首先出现。显然,有多个名为table_name 的表。您必须了解 search_path 的作用才能正确理解这一点:

第一个表位于schema_namesearch_path之前的架构中(或者schema_name根本没有列在那里)。因此,非限定表名称将解析为此表(或视图)。检查当前角色可以在数据库中访问的名为“table_name”的表列表:

SELECT *
FROM   information_schema.tables 
WHERE  table_name = 'table_name';

视图只是内部附加RULE的特殊表。它们可以扮演与常规表相同的角色,并包含在上述查询中。 详细说明: