У любой базы данных в 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:
В нашем случае таблица имеет 6 ограничений:
- 4 CHECK — четыре ограничения на отсутствие пустого значения
- 1 PRIMARY KEY — одно ограничение на первичный ключ
- 1 UNIQUE — одно ограничение на уникальность
Визуально данная таблица выглядит так:
Представление «table_constraints» отображает 10 столбцов с полезной информацией:
- constraint_catalog sql_identifier — Имя базы данных, содержащей ограничение (всегда текущая база)
- constraint_schema sql_identifier — Имя схемы, содержащей ограничение
- constraint_name sql_identifier — Имя ограничения
- table_catalog sql_identifier — Имя базы данных, содержащей таблицу (всегда текущая база)
- table_schema sql_identifier — Имя схемы, содержащей таблицу
- table_name sql_identifier — Имя таблицы
- constraint_type character_data — Тип ограничения: CHECK, FOREIGN KEY, PRIMARY KEY или UNIQUE
- is_deferrable yes_or_no — YES, если ограничение откладываемое, или NO в противном случае
- initially_deferred yes_or_no — YES, если ограничение откладываемое и отложенное изначально, или NO в противном случае
- enforced yes_or_no — Относится к функциональности, отсутствующей в PostgreSQL (в настоящее время всегда равно YES)
Как получить список имён ограничений (CONSTRAINT) одной таблицы в PostgreSQL?
SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = 't_d_8411';
Какую информацию можно получить, зная имя ограничения одной таблицы в 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';
Информационные ссылки
Официальный сайт 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