通过匹配列名生成 FK 约束

Generating FK constraints by matching column names

我有一个数据库结构,有两个tables A & B.

A 包含几列,其中一列 BiD 作为对 table B.

主键的外键引用

问题是列已定义,但 FK 约束不存在。所以我正在寻找一种通过某种自动化方法生成这些约束的方法,因为我正在处理的真实数据库有一百多个 tables。

我的数据库在 Oracle 11g 中,我在 Enterprise Architect 中也有它的 ERD 模型。任何这些解决方案都会起作用。有没有这种可能请指教

all_tab_columns(或 dba_user_ 版本)将包含列名和它们所在的 table。如果您只是想查找所有列命名为 BiD 并为 B 创建一个外键约束,你可以这样做

BEGIN
  FOR child IN (SELECT owner, table_name, column_name
                  FROM dba_tab_columns
                 WHERE column_name = 'BID'
                   and owner IN (<<schemas you care about>>))
  LOOP
    EXECUTE IMMEDIATE 
      'ALTER TABLE ' || child.owner || '.' || child.table_name ||
      ' ADD CONSTRAINT fk_' || child.table_name || '_a FOREIGN KEY( bid ) ' ||
      ' REFERENCES b(bid) ';
  END LOOP;
END;

在实际系统中,您可能希望在构建 SQL 语句的地方有一个局部变量,这样您可以在执行前记录它,以防出现错误。如果您有区分大小写的标识符,或者如果您使用此模式生成的约束名称超过 30 个字符,则您需要添加逻辑来处理这些情况。