2014-11-07 3 views
0

PostgreSQL сценария обновления базы данных добавляет внешние ключи команды ограничений с помощью:Как добавить внешний ключ, только если она не существует

update omrid set tellkanne=null where tellkanne =0 or tellkanne not in (select dokumnr from dok); 

alter table omrid ADD constraint omrid_tellkanne_fkey FOREIGN KEY (tellkanne) 
REFERENCES dok(dokumnr) ON UPDATE CASCADE on delete set null DEFERRABLE 

dokumnr является точкой таблицы первичного ключа с serial типом. оба поля: int Тип

Требуется много времени, если внешний ключ уже добавлен до сообщения об ошибке. Как выполнять эти команды только в том случае, если внешний ключ omrid_tellkanne_fkey не существует?

+0

Было бы легче понять ваш вопрос, если вы добавите свои таблицы DDL. – Houari

+1

Как часто вам нужно добавить ограничение внешнего ключа? –

+0

Мне нужно добавить его во время обновления приложения. Если новая версия установлена ​​на клиентский сайт, выполняется сценарий обновления. Это происходит 1,30 раза в год – Andrus

ответ

0

Вы можете запросить одно из представлений information_schema, чтобы узнать, существует ли ограничение этого имени.

select constraint_name 
from information_schema.referential_constraints 
where constraint_name = 'omrid_tellkanne_fkey'; 

Независимо от того, работает ли оно надежно, зависит от приложения. Хотя этот будет достоверно рассказать вам, существует ли ограничение внешнего ключа с именем «omrid_tellkanne_fkey», он не скажет вам, является ли это ограничение внешним ограничением между интересующими вас таблицами. Вам понадобится присоединиться к одной или двум таблицам из представлений information_schema, чтобы получить это.

Более общий запрос может выглядеть следующим образом.

select k.table_catalog || '.' || 
     k.table_schema || '.' || 
     k.table_name referencing_table, 
     r.constraint_name, 
     c.table_catalog || '.' || 
     c.table_schema || '.' || 
     c.table_name referenced_table 
from information_schema.referential_constraints r 
inner join information_schema.key_column_usage k 
    on r.constraint_catalog = k.constraint_catalog 
    and r.constraint_schema = k.constraint_schema 
    and r.constraint_name = k.constraint_name 
inner join information_schema.constraint_column_usage c 
    on r.constraint_catalog = c.constraint_catalog 
    and r.constraint_schema = c.constraint_schema 
    and r.constraint_name = c.constraint_name 
-- Change this WHERE clause to match your object names. 
where r.constraint_catalog = 'your_database' 
    and r.constraint_schema = 'your_schema' 
    and r.constraint_name = 'omrid_tellkanne_fkey' 
    and k.table_name = 'omrid' 
    and c.table_name = 'dok'; 
Смежные вопросы