Запит 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.