sql >> Database teknologi >  >> RDS >> PostgreSQL

Psql liste over alle tabeller

Hvis du ønsker at liste alle tabeller, skal du bruge:

\dt *.*

for at angive, at du vil have alle tabeller i alle skemaer . Dette vil inkludere tabeller i pg_catalog , systemtabellerne og dem i information_schema . Der er ingen indbygget måde at sige "alle tabeller i alle brugerdefinerede skemaer"; du kan dog indstille din search_path til en liste over alle skemaer af interesse, før du kører \dt .

Du ønsker måske at gøre dette programmatisk, i hvilket tilfælde psql backslash-kommandoer vil ikke gøre arbejdet. Det er her INFORMATION_SCHEMA kommer til undsætning. Sådan viser du tabeller:

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

BTW, hvis du nogensinde vil se hvad psql udfører som svar på en backslash-kommando, skal du køre psql med -E flag. f.eks.:

$ 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å du kan se den psql søger pg_catalog.pg_database når den får en liste over databaser. Tilsvarende for tabeller i en given database:

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 er at foretrække at bruge den bærbare INFORMATION_SCHEMA SQL-standard i stedet for Pg-systemkatalogerne, hvor det er muligt, men nogle gange har du brug for Pg-specifik information. I disse tilfælde er det fint at forespørge systemkatalogerne direkte og psql -E kan være en nyttig guide til, hvordan du gør det.



  1. 4 funktioner til at returnere måneden fra en dato i MariaDB

  2. Hvordan finder man grænserne for grupper af sammenhængende sekventielle tal?

  3. Flerkolonneindeks på 3 felter med heterogene datatyper

  4. 3 måder at returnere en streng af flere mellemrum i SQL Server