为什么在指定架构名称时,PostgreSQL SELECT查询返回不同的结果?

为什么在指定架构名称时,PostgreSQL SELECT查询返回不同的结果?,postgresql,database-schema,postgresql-9.2,database-permissions,search-path,Postgresql,Database Schema,Postgresql 9.2,Database Permissions,Search Path,我有一个PostgreSQL数据库表,有4列-标记为column_a、column_b等。我想用一个简单的select查询来查询这个表: select * from table_name; 我得到的一些结果如下: column_a | column_b ---------+--------- 'a value'|'b_value' 但当我使用此查询时: select * from schema_name.table_name; 我得到了全部结果: column_a | column_b |

我有一个PostgreSQL数据库表,有4列-标记为column_a、column_b等。我想用一个简单的select查询来查询这个表:

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
在初始表创建之后的稍后日期添加。我的问题是:当模式名不在select查询中时,为什么数据库会忽略后面的列?

表名在Postgres中的数据库中不是唯一的。在不同的模式中可以有任意数量的名为“table\u name”的表,包括临时模式,除非在
搜索路径
中的其他模式之后显式列出临时模式,否则临时模式总是排在第一位。显然,有多个名为
table\u name
的表。您必须了解搜索路径的作用,才能正确解释:

第一个表位于
search\u path
schema\u name
之前的模式中(或者
schema\u name
根本没有列出)。因此,非限定表名被解析为该表(或视图)。检查数据库中当前角色有权访问的名为“table_name”的表列表:

SELECT *
FROM   information_schema.tables 
WHERE  table_name = 'table_name';
视图只是一个特殊的表,内部附有
规则。它们可以扮演与常规表相同的角色,并包含在上述查询中。
详情:


您确定在不同的架构中没有两个同名的表(或视图)?这让我发现,有几个同名的表无意中被放在了公共架构中。谢谢