【问题标题】:Why does a PostgreSQL SELECT query return different results when a schema name is specified?为什么指定模式名称时 PostgreSQL SELECT 查询返回不同的结果?
【发布时间】:2015-07-22 15:06:59
【问题描述】:

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

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

【问题讨论】:

  • 您确定没有两个同名的表(或视图)在不同的架构中吗?

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


【解决方案1】:

在 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 的特殊表。它们可以起到与常规表相同的作用,并包含在上述查询中。 详情:

【讨论】:

  • 这让我发现少数具有重复名称的表被无意中放置在公共模式中。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
相关资源
最近更新 更多