10

PostgreSQL で、異なるスキーマに同じ名前のテーブルがある\dt場合、以下の例のように、検索パスにリストされた最初のスキーマのテーブルのみが含まれるのはなぜですか?

私は興味を持っている:

  1. これが望ましい理由、および

  2. 基になるクエリが与えられた場合に実際にどのように達成されるか\dt(以下を参照)。

(ところで、この回答\dt *.*から、すべてのスキーマのすべてのテーブルがリストされることに気付きましたが、以下の例では、私が行っている2つに加えて、不要な58のシステムテーブルが得られます!)


dt_test=# CREATE SCHEMA first;
CREATE SCHEMA
dt_test=# CREATE SCHEMA second;
CREATE SCHEMA
dt_test=# CREATE TABLE first.my_table(id integer);
CREATE TABLE
dt_test=# CREATE TABLE second.my_table(id integer);
CREATE TABLE
dt_test=# set search_path to first,second;
SET
dt_test=# \dt
         List of relations
 Schema |   Name   | Type  | Owner  
--------+----------+-------+--------
 first  | my_table | table | postgres
(1 row)

dt_test=# set search_path to second,first;
SET
dt_test=# \dt
         List of relations
 Schema |   Name   | Type  | Owner  
--------+----------+-------+--------
 second | my_table | table | postgres
(1 row)

基礎となるクエリ\dt(psql が -E コマンドで起動されたときに表示されます。たとえば、psql -E dt_test)

********* QUERY **********
SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
**************************
4

3 に答える 3

5

以下はマニュアルからの引用です: http://www.postgresql.org/docs/current/static/functions-info.html

表9-61に、特定のオブジェクトが現在のスキーマ検索パスで表示されるかどうかを判断する関数を示します。たとえば、テーブルを含むスキーマが検索パスにあり、同じ名前のテーブルが検索パスの前に現れない場合、そのテーブルは可視であると言われます。

重要な部分:同じ名前のテーブルが検索パスの前に表示されない

によってブロックされているため、テーブルは表示されませset search_path to first,second;second.my_tablefirst.my_table

于 2014-10-14T08:53:03.503 に答える
1

すべてのスキーマで必要なテーブルだけを一覧表示するには:

\dt *.my_table
         List of relations
 Schema |   Name   | Type  | Owner 
--------+----------+-------+-------
 first  | my_table | table | cpn
 public | my_table | table | cpn
 second | my_table | table | cpn
于 2014-10-14T09:35:45.747 に答える
0

すべてのユーザー テーブルをプレフィックス付きで一覧表示する

\dt *.<table_prefix>*

例:

 \dt *.my*
于 2021-07-16T15:27:41.197 に答える