Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Помогите пожалуйста написать системный скриптик...  [new]
lr2
Member

Откуда:
Сообщений: 148
Доброй ночи.

Пытаюсь достать DDL для всех FOREIGN KEY в БД.



С обычноми все в порядке, а вот составные, когда указано по два поля, не получается.



Вот такую связку талиц пытался использовать:

SELECT *
      FROM information_schema.table_constraints tc
LEFT JOIN information_schema.key_column_usage kcu
       ON tc.constraint_catalog = kcu.constraint_catalog
      AND tc.constraint_schema = kcu.constraint_schema
      AND tc.constraint_name = kcu.constraint_name
LEFT JOIN information_schema.referential_constraints rc
       ON tc.constraint_catalog = rc.constraint_catalog
      AND tc.constraint_schema = rc.constraint_schema
      AND tc.constraint_name = rc.constraint_name
LEFT JOIN information_schema.constraint_column_usage ccu
       ON rc.unique_constraint_catalog = ccu.constraint_catalog
      AND rc.unique_constraint_schema = ccu.constraint_schema
      AND rc.unique_constraint_name = ccu.constraint_name    
WHERE 
tc.constraint_schema='public'
AND tc.constraint_type='FOREIGN KEY'


Но для составного FK там не 1 а 4 записи, и как там что связать не могу додуматься
29 апр 21, 02:20    [22316070]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
lr2
Member

Откуда:
Сообщений: 148
DDL таблиц с этими FK не подходят, т.к. надо добавить FK к уже существующим таблицам.
29 апр 21, 02:21    [22316071]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
lr2
Member

Откуда:
Сообщений: 148
Ни кто не знает?
29 апр 21, 11:02    [22316187]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 803
lr2,

Запрос к информационной схеме безусловно можно доработать. Правда нужно учитывать не только составные внешние ключи, но и такие потенциальные вещи, как отложенные ограничения (DEFERRED), каскадные действия (ON DELETE CASCADE), что-то еще.

Возможно стоит посмотреть на уже готовые решения.
1. pg_dump
2. Системные функции, а именно: pg_get_constraintdef.
29 апр 21, 11:17    [22316195]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
lr2
Member

Откуда:
Сообщений: 148
Павел Лузанов
lr2,

Запрос к информационной схеме безусловно можно доработать. Правда нужно учитывать не только составные внешние ключи, но и такие потенциальные вещи, как отложенные ограничения (DEFERRED), каскадные действия (ON DELETE CASCADE), что-то еще.

Возможно стоит посмотреть на уже готовые решения.
1. pg_dump
2. Системные функции, а именно: pg_get_constraintdef.



Спасибо!

pg_get_constraintdef - это похоже на то что надо.




Но как узнать oid для FK ?


В pg_class содежит только PK из констрайнтов:

SELECT relname,oid FROM pg_class
WHERE relname IN (SELECT constraint_name FROM  information_schema.table_constraints WHERE constraint_type<>'CHECK')
29 апр 21, 11:48    [22316217]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 803
lr2
Но как узнать oid для FK ?

Список всех ограничений таблицы:
SELECT pg_get_constraintdef(oid), * FROM pg_constraint WHERE conrelid = 'имя_таблицы'::regclass;

Если нужны только FK, отфильтруйте по contype.

Сообщение было отредактировано: 29 апр 21, 11:47
29 апр 21, 11:54    [22316222]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста написать системный скриптик...  [new]
lr2
Member

Откуда:
Сообщений: 148
Павел Лузанов
lr2
Но как узнать oid для FK ?

Список всех ограничений таблицы:
SELECT pg_get_constraintdef(oid), * FROM pg_constraint WHERE conrelid = 'имя_таблицы'::regclass;



То что надо!!!

Огромное спасибо!
29 апр 21, 11:56    [22316223]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить