Как получить имя столбца из pg_constraint - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно получить список ограничений из базы данных и сопоставить их со столбцами, к которым они относятся. Для этой задачи я собираюсь использовать pg_constraint. Вот запрос, который я использую

 select conrelid::regclass AS table_from, conname, pg_get_constraintdef(c.oid)
from   pg_constraint c
join   pg_namespace n ON n.oid = c.connamespace
 where conrelid::regclass::text = 'test' order by contype;

Как видите, меня интересуют ограничения для таблицы с именем test Вот вывод

table_from |    conname     | pg_get_constraintdef 
------------+----------------+----------------------
 test       | test_age_check | CHECK ((age > 0))

Но Я хочу получить имя столбца для этого ограничения, используя запрос выше (в этом случае столбец age ). Согласно до c Column constraints are not treated specially. Но, может быть, есть несколько способов, которыми я могу использовать для получения имени столбца из pg_constraint ?

1 Ответ

1 голос
/ 05 марта 2020

pg_constrint.conkey содержит массив порядковых номеров столбцов в таблице. Вы можете использовать их, чтобы присоединиться к pg_attribute. Здесь порядковый номер в столбце attnum.

SELECT c.conrelid::regclass AS table_from,
       c.conname,
       pg_get_constraintdef(c.oid),
       a.attname
       FROM pg_constraint c
            INNER JOIN pg_namespace n
                       ON n.oid = c.connamespace
            CROSS JOIN LATERAL unnest(c.conkey) ak(k)
            INNER JOIN pg_attribute a
                       ON a.attrelid = c.conrelid
                          AND a.attnum = ak.k
       WHERE c.conrelid::regclass::text = 'test'
       ORDER BY c.contype;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...