0

我有一个数据库结构,其中两个表A & B通过匹配列名生成FK约束

A包含几列,包括作为表B的主键的外键引用的列BiD

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

我的数据库使用的是Oracle 11g,我也在Enterprise Architect中使用其ERD模型。在任何这些解决方案将工作。请建议是否有这种可能性。

回答

0

all_tab_columns(或dba_user_版本)将列名和他们所在的表,如果你只是想找到一个名为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个字符,则需要添加逻辑来处理这些情况。

+0

他可能在如何在EA中进行建模而不是在Oracle中进行建模。 –

+0

@ThomasKilian--这不是我读这个问题的方式。如果你希望EA有约束,但是为了不强制约束,你可以将它们创建为'RELY DISABLE NOVALIDATE'。我希望EA会导入它们,尽管数据库不会执行它们。 –

+0

也许吧。所以问题是:为什么使用Enterprise Architect进行标记?如果问题与EA无关,则应将标签移除。 –