PostgreSQL で、異なるスキーマに同じ名前のテーブルがある\dt
場合、以下の例のように、検索パスにリストされた最初のスキーマのテーブルのみが含まれるのはなぜですか?
私は興味を持っている:
これが望ましい理由、および
基になるクエリが与えられた場合に実際にどのように達成されるか
\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;
**************************