通过匹配列名生成 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 个字符,则您需要添加逻辑来处理这些情况。
我有一个数据库结构,有两个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 个字符,则您需要添加逻辑来处理这些情况。