2017-04-16 46 views
0

分配給孩子,我有兩個表:創建於父表觸發器,可以在子表創建行和新的父PK爲FK

Customer (customerID, firstName, lastName,....) 

Account (accountID, currentBalance....customerID) customerID references CUSTOMER. 

的表有一個1:M(客戶:賬戶),Mandatory-強制性關係。 我想設置自動創建當父插入子行觸發器,研究堆後和其他地方我已成功地創建父一個觸發器,創建在子行:

CREATE OR REPLACE TRIGGER CMustHaveAccount 
    AFTER INSERT ON CUSTOMER 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO ACCOUNT (accountID) 
     SELECT SEQACCOUNTID.NEXTVAL 
     FROM dual; 
    END; 
/

我所有的嘗試設置FK在賬戶中的客戶都沒有新的PK,我嘗試了一些觸發器,最有前途的幸福的:

CREATE OR REPLACE TRIGGER AMustHaveCustomer 
    AFTER INSERT ON CUSTOMER 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO ACCOUNT (customerID) 
     SELECT :new.customerID 
     FROM CUSTOMER; 
    END; 
/

這觸發回拋出錯誤

ORA-04091:表。客戶被突變,觸發/功能可能無法看到它

。 如果我將觸發器更改爲BEFORE,則會給出錯誤ORA-01400: cannot insert NULL into ("ACCOUNT"."ACCOUNTID")。我假設,因爲技術上插入尚未完成,所以我插入到客戶的PK尚不存在。

我想要一個觸發器,它將一個值插入到Account中,並在我的序列中有一個主鍵,當在Customer中創建一行時,並且PK customerID被自動分配給ACCOUNT中的customerID爲外鍵。

我只是在學習SQL和數據庫,如果答案很明顯,請原諒我。 非常感謝!

回答

0

ACCOUNT的外鍵是CUSTOMER的主鍵,所以這應該適合你。請注意0​​關鍵字,這是如何引用當前記錄中的值並避免「變異表」錯誤。

CREATE OR REPLACE TRIGGER CMustHaveAccount 
AFTER INSERT ON CUSTOMER 
FOR EACH ROW 
BEGIN 
    INSERT INTO ACCOUNT (accountID, currentBalance, customerID) 
    values (SEQACCOUNTID.NEXTVAL, 0, :NEW.customerID); 
END; 
/
+0

它的工作原理如此簡單。我一直在掙扎數小時,非常感謝。 – user6898323