вторник, 8 сентября 2015 г.

Получение внешних связей для таблицы в PostgreSQL

Иногда бывает необходимо удалить строки из таблицы, с которыми связаны через внешние ключи строки в других таблицах.
Интерфейс PgAdmin не позволяет узнать все внешние связи для  данной таблицы.
Разработчики фактически предлагают нам проверять каждую таблицу, кликая на пункт "Ограничения" (constraints) в дереве, и проверять, есть ли связь с исходной таблицей или нет.
Чтобы обойти это ограничение я пользуюсь следующим запросом, позволяющим выявить внешние связи для полей определенной таблицы:



select confrelid::regclass as table_source
, af.attname as source_key,
conrelid::regclass as table_dest,
a.attname as dest_key,
ss2.conname as constraint_name
from pg_attribute af, pg_attribute a,
(select conrelid,confrelid,conkey[i] as conkey, confkey[i] as confkey,conname
from (select conrelid,confrelid,conkey,confkey,
generate_series(1,array_upper(conkey,1)) as i,conname
from pg_constraint where contype = 'f') ss) ss2
where af.attnum = confkey and af.attrelid = confrelid and
a.attnum = conkey and a.attrelid = conrelid
AND confrelid::regclass = 'gateway.as_goods'::regclass
order by conrelid::regclass,a.attname;



gateway.as_goods - это исходная таблица, для которой выявляются внешние связи ( с указанием схемы )


Выходные столбцы:

table_source - исходная таблица (в примере - gateway.as_goods)
source_key - поле-ключ из исходной таблицы 
table_dest - таблица, связанная с исходной
dest_key - внешний ключ, находящийся в таблице table_dest
constraint_name - наименование внешней связи

Выявив наименование внешней связи, ее можно удалить с помощью команды:


ALTER TABLE table_dest
DROP CONSTRAINT constraint_name;


Каталог блогов Blogolist