sql >> Databasteknik >  >> RDS >> PostgreSQL

Psql lista alla tabeller

Om du vill lista alla tabeller måste du använda:

\dt *.*

för att indikera att du vill ha alla tabeller i alla scheman . Detta kommer att inkludera tabeller i pg_catalog , systemtabellerna och de i information_schema . Det finns inget inbyggt sätt att säga "alla tabeller i alla användardefinierade scheman"; du kan dock ställa in din search_path till en lista över alla scheman av intresse innan du kör \dt .

Du kanske vill göra detta programmatiskt, i vilket fall psql backslash-kommandon kommer inte att göra jobbet. Det är här INFORMATION_SCHEMA kommer till undsättning. För att lista tabeller:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

BTW, om du någonsin vill se vad psql gör som svar på ett omvänt snedstreck kommando, kör psql med -E flagga. t.ex.:

$ 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;
**************************

så att du kan se den psql söker pg_catalog.pg_database när den får en lista över databaser. På samma sätt, för tabeller inom en given databas:

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;

Det är att föredra att använda den bärbara SQL-standarden INFORMATION_SCHEMA istället för Pg-systemkatalogerna där det är möjligt, men ibland behöver du Pg-specifik information. I dessa fall går det bra att fråga systemkatalogerna direkt och psql -E kan vara en användbar guide för hur du gör det.



  1. Kör uppsättning SQL-frågor med batchfil?

  2. UNION resultatet av flera lagrade procedurer

  3. Vad är "rowversion" i SQL Server?

  4. Row Goals, del 3:Anti Joins