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

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_no — YES, если ограничение откладываемое, или NO в противном случае
  9. initially_deferred yes_or_no — YES, если ограничение откладываемое и отложенное изначально, или 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-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://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