PostgreSQL | Как получить список ограничений одной таблицы? — efim360.ru

PostgreSQL | Как получить список ограничений одной таблицы?

У любой базы данных в PostgreSQL есть такая схема данных, которая называется "information_schema". В тексте мы будем называть её "Информационная схема".

"Информационная схема" состоит из набора представлений, содержащих информацию об объектах, определённых в текущей базе данных.

"Информационная схема" не относится к каталогам самого PostgreSQL. "Информационная схема" описана в стандарте SQL, который более масштабен и уникален во всём мире. Это значит что "Информационная схема" будет доступна любой базе данных на основе SQL, в том числе и для PostgreSQL.

 

Как получить все возможные ограничения (CONSTRAINT) одной таблицы в базе данных?

В "Информационной схеме" существует 64 представления на 2022 год на 14 версию PostgreSQL.

Нас интересует представление, которое называется "table_constraints". Оно  показывает все ограничения, принадлежащие таблицам, к которым имеет доступ текущий пользователь (являясь владельцем или имея некоторые права, кроме SELECT).

Если в базе данных много таблиц или много ограничений, то обращение к получению всех ограничений может вызвать перегруз. Записей в итоговой таблице может быть очень много. Но если вы всё равно хотите рискнуть, то команда выглядит так:

SELECT * FROM information_schema.table_constraints;

Но если нас интересует всего одна таблица, то мы можем добавить в запрос оператор WHERE:

SELECT * FROM information_schema.table_constraints WHERE table_name = 't_d_8411';

Скриншот из pgAdmin 4:

Получили список ограничений одной таблицы в PostgreSQL
Получили список ограничений одной таблицы в PostgreSQL

В нашем случае таблица имеет 6 ограничений:

  • 4 CHECK - четыре ограничения на отсутствие пустого значения
  • 1 PRIMARY KEY - одно ограничение на первичный ключ
  • 1 UNIQUE - одно ограничение на уникальность

Визуально данная таблица выглядит так:

Фрагмент таблицы 8411 в PostgreSQL
Фрагмент таблицы 8411 в PostgreSQL

 

Представление "table_constraints" отображает 10 столбцов с полезной информацией:

  1. constraint_catalog sql_identifier - Имя базы данных, содержащей ограничение (всегда текущая база)
  2. constraint_schema sql_identifier - Имя схемы, содержащей ограничение
  3. constraint_name sql_identifier - Имя ограничения
  4. table_catalog sql_identifier - Имя базы данных, содержащей таблицу (всегда текущая база)
  5. table_schema sql_identifier - Имя схемы, содержащей таблицу
  6. table_name sql_identifier - Имя таблицы
  7. constraint_type character_data - Тип ограничения: CHECK, FOREIGN KEY, PRIMARY KEY или UNIQUE
  8. is_deferrable yes_or_noYES, если ограничение откладываемое, или NO в противном случае
  9. initially_deferred yes_or_noYES, если ограничение откладываемое и отложенное изначально, или NO в противном случае
  10. enforced yes_or_no - Относится к функциональности, отсутствующей в PostgreSQL (в настоящее время всегда равно YES)

 

Как получить список имён ограничений (CONSTRAINT) одной таблицы в PostgreSQL?

SELECT constraint_name
FROM information_schema.table_constraints
WHERE table_name = 't_d_8411';
Получили список имён ограничений одной таблицы в PostgreSQL
Получили список имён ограничений одной таблицы в PostgreSQL

 

Какую информацию можно получить, зная имя ограничения одной таблицы в PostgreSQL?

Зная имена табличных ограничений можно воспользоваться представлением "check_constraints", чтобы получить выражение проверки (check_clause) для ограничения типа CHECK. Например:

SELECT * FROM information_schema.check_constraints WHERE constraint_name = '25424_126788_3_not_null';

SELECT check_clause FROM information_schema.check_constraints WHERE constraint_name = '25424_126788_3_not_null';
Получили выражение проверки по имени ограничения с типом CHECK в PostgreSQL
Получили выражение проверки по имени ограничения с типом CHECK в PostgreSQL

 

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdmin - https://www.pgadmin.org

Официальный сайт СУБД PostgreSQL - https://www.postgresql.org

Раздел "Ограничения" - https://postgrespro.ru/docs/postgresql/14/ddl-constraints

Раздел "Информационная схема" - https://postgrespro.ru/docs/postgresql/14/information-schema

Представление "table_constraints" - https://postgrespro.ru/docs/postgresql/14/infoschema-table-constraints