【问题标题】:How to add foreign key only if it does not exist仅当外键不存在时如何添加
【发布时间】:2014-11-08 00:56:15
【问题描述】:

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

dokumnrserial 类型的点表主键。 两个字段都是int 类型

如果在报错之前已经添加了外键,需要很多时间。 仅当外键 omrid_tellkanne_fkey 不存在时如何运行这些命令?

【问题讨论】:

  • 如果您添加相关表格 DDL,您的问题会更容易理解。
  • 您需要多久添加一次外键约束?
  • 应用升级时需要添加。如果新版本安装到客户站点,升级脚本将运行。它每年发生 1..30 次

标签: sql postgresql foreign-keys


【解决方案1】:

您可以查询其中一个 information_schema 视图以查看该名称的约束是否存在。

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

这是否可靠工作取决于应用程序。尽管此可靠地告诉您是否存在名为“omrid_tellkanne_fkey”的外键约束,但它不会告诉您该约束是否是您感兴趣的表之间的外键约束 /em>。您需要从 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2013-02-13
    • 2016-10-19
    • 2010-11-02
    • 2013-06-14
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多