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無關,則應將標籤移除。 –