Jeśli chcesz wymienić wszystkie tabel, należy użyć:
\dt *.*
się wskazywać, że chcesz wszystkie tabele we wszystkich schematach. Obejmuje to tabele w pg_catalog
, tabele systemowe i te w information_schema
. Nie ma wbudowanego sposobu mówienia "wszystkie tabele we wszystkich schematach definiowanych przez użytkownika"; możesz jednak ustawić swoją search_path
na listę wszystkich schematów, przed uruchomieniem \dt
.
Możesz chcieć zrobić to programowo, w takim przypadku psql
Polecenia ukośnika odwrotnego nie wykonają zadania. Tutaj na ratunek przychodzi the INFORMATION_SCHEMA
. Aby wyświetlić tabele:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
BTW, jeśli kiedykolwiek chcesz zobaczyć, co psql
robi w odpowiedzi na polecenie backslash, uruchom psql
z flagą -E
. np:
$ psql -E regress
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
d.datcollate as "Collate",
d.datctype as "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************
więc widać, że psql
poszukuje pg_catalog.pg_database
gdy robi listę baz danych. Podobnie, dla tabel w danej bazie danych:
SELECT n.nspname as "Schema",
c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN '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;
Jest to korzystne jest stosowanie standardu SQL-przenośne INFORMATION_SCHEMA
zamiast katalogach systemowych Pg gdzie jest to możliwe, ale czasami potrzebują Państwo Pg-konkretne informacje. W takich przypadkach wystarczy zapytać bezpośrednio o numer system catalogs, a pomocny może okazać się przewodnik po nim.
Wow! Dziękuję bardzo za BTW. To jest bardzo cenne. –
'information_schema.tables' zawiera widoki z jakiegoś powodu. (W każdym razie w PostgreSQL 9.2). – jpmc26
@ jpmc26 Tak, z 'table_type = 'VIEW'', więc można je łatwo wykluczyć. Ogólnie SQL próbuje traktować widoki tak samo jak tabele tak bardzo, jak to możliwe. –