为什么在指定模式名称时 PostgreSQL SELECT 查询 return 不同的结果?
Why does a PostgreSQL SELECT query return different results when a schema name is specified?
我有一个包含 4 列的 PostgreSQL 数据库 table - 标记为 column_a、column_b 等。我想用一个简单的 [=30] 来查询这个 table =]查询:
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
是在最初 table 创建之后添加的。我的问题是:当架构名称被排除在 select 查询之外时,为什么数据库会忽略后面的列?
Table 名称在 Postgres 的数据库中不是唯一的。在不同的模式中可以有任意数量的名为 'table_name' 的 table - 包括临时模式,除非您明确地将其列在 search_path
中的其他模式之后,否则它总是排在第一位。显然,有 多个 table 名为 table_name
。您必须了解 search_path
的作用才能正确解释:
- How does the search_path influence identifier resolution and the "current schema"
第一个 table 存在于 search_path
中 schema_name
之前的架构中(或者 schema_name
根本没有列出)。因此,不合格的 table 名称被解析为此 table(或视图)。检查您的当前角色在您的数据库中有权访问的名为 'table_name' 的 table 的列表:
SELECT *
FROM information_schema.tables
WHERE table_name = 'table_name';
视图只是特殊的 table,内部附加了 RULE
。它们可以起到与常规 table 相同的作用,并包含在上述查询中。
详情:
- How to check if a table exists in a given schema
我有一个包含 4 列的 PostgreSQL 数据库 table - 标记为 column_a、column_b 等。我想用一个简单的 [=30] 来查询这个 table =]查询:
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
是在最初 table 创建之后添加的。我的问题是:当架构名称被排除在 select 查询之外时,为什么数据库会忽略后面的列?
Table 名称在 Postgres 的数据库中不是唯一的。在不同的模式中可以有任意数量的名为 'table_name' 的 table - 包括临时模式,除非您明确地将其列在 search_path
中的其他模式之后,否则它总是排在第一位。显然,有 多个 table 名为 table_name
。您必须了解 search_path
的作用才能正确解释:
- How does the search_path influence identifier resolution and the "current schema"
第一个 table 存在于 search_path
中 schema_name
之前的架构中(或者 schema_name
根本没有列出)。因此,不合格的 table 名称被解析为此 table(或视图)。检查您的当前角色在您的数据库中有权访问的名为 'table_name' 的 table 的列表:
SELECT *
FROM information_schema.tables
WHERE table_name = 'table_name';
视图只是特殊的 table,内部附加了 RULE
。它们可以起到与常规 table 相同的作用,并包含在上述查询中。
详情:
- How to check if a table exists in a given schema