Запит PostgreSQL, щоб перелічити всі назви таблиць?


184

Чи є доступний запит для переліку всіх таблиць у моєму БД Postgres.

Я спробував один запит, як:

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

Але цей запит також повертає перегляди.

Як я можу отримати лише назви таблиць, а не перегляди?

Відповіді:


307

Що стосується цього запиту (на основі опису з посібника )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';

4
це найкраща відповідь тут.
Томмі

3
Що таке тип таблиці?
Брайан Брайс

table_type з посібника: Тип таблиці: BASE TABLE для стійкого базового столу (звичайний тип таблиці), VIEW для перегляду, FOREIGN для іноземного столу, або LOCAL TEMPORARY для тимчасового столу
tzachs

38

Якщо ви хочете список баз даних

SELECT datname FROM pg_database WHERE datistemplate = false;

Якщо ви хочете список таблиць з поточної установки pg всіх баз даних

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;

Принаймні, у Postgres 9.5, це неправда. У мене є 3 бази даних в одному кластері, і це лише повертаються таблиці з поточної бази даних.
судо

Документація говорить лише про поточну: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Ім'я бази даних, яка містить таблицю (завжди поточна база даних)"
sudo

28

Відкрийте термінал postgres з потрібною базою даних:

psql dbname (run this line in a terminal)

потім запустіть цю команду в середовищі постгресів

\d

Це опише всі таблиці за назвою. В основному це список таблиць за прізвищем за зростанням.

Потім ви можете спробувати це описати таблицю за полями:

\d tablename.

Сподіваюся, це допомагає.


@wingedpanther як це зробити? є \dможливість перелічити лише всі таблиці, без індексу, без послідовності, ...?
Пітер Краус

5
Хіба \dtдля цього немає?
торок

11

Спробуйте це:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema='public' AND table_type='BASE TABLE'

ця працює!


Я не думаю, що нам це потрібно table_type='BASE TABLE'. Можливо, я помиляюся, ви можете, будь ласка, докладно пояснити?
абригги

іноді корисно фільтрувати поточний підключений БД, додаючи: та table_catalog = current_database ()
Дієго Скаравадгі

8
select 
 relname as table 
from 
 pg_stat_user_tables 
where schemaname = 'public'

select 
  tablename as table 
from 
  pg_tables  
where schemaname = 'public'

1
pg_stat_user_tablesможе не бути заповненим, якщо track_activitiesвимкнено. Використання "офіційного" API, такого як pg_tablesабо information_schema.tableє набагато кращим вибором.
a_horse_with_no_name


0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

Для MySQL вам знадобиться table_schema = 'dbName', а для MSSQL видаліть цю умову.

Зауважте, що "показано лише ті таблиці та представлення, до яких має доступ поточний користувач". Крім того, якщо у вас є доступ до багатьох баз даних і хочете обмежити результат певною базою даних, ви можете досягти цього, додавши умову AND table_catalog = 'yourDatabase' (в PostgreSQL).

Якщо ви також хочете позбутися заголовка із зазначенням назв рядків та нижнього колонтитулу, що показує кількість рядків, ви можете або запустити psql з параметром командного рядка -t (скорочено лише для --tuples), або ви можете переключити налаштування в psql's командний рядок на \ t (скорочено для \ pset tuples_only). Це може бути корисним, наприклад, для передачі даних до іншої команди з командою \ g [|].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.