簡體   English   中英

僅在不存在外鍵時如何添加

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM