[英]SQL: add a default constraint on foreign key column where foreign key reference does not exist
[英]How to add foreign key only if it does not exist
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
如何運行這些命令?
您可以查詢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';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.