2017-04-16 1 views
0

として子供に新しい親PKを割り当てる親テーブル上のトリガーを作成します必須の関係。 私は別の場所スタックを調査した後、私は子供の行を作成し、親にトリガを作成するために管理している、セットアップに親が挿入されたときに自動的に子行を作成し、トリガーをしようとしています:は、私は2つのテーブルを持っている子表の行が作成され、FK

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

お客様に新しいPKとしてアカウントにFKを設定するために、すべての私の試みは失敗している、私は、最も有望なビーイングのトリガの数を試してみました:

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:表.CUSTOMERが変異され、トリガー/関数は

を参照しなくてもよいです。 トリガーをBEFOREに変更すると、エラーORA-01400: cannot insert NULL into ("ACCOUNT"."ACCOUNTID")が返されます。私は技術的に挿入が完了していないので、顧客に挿入しているPKがまだ存在しないと想定しています。

シーケンスにプライマリキーを挿入し、顧客で行が作成されたときに、アカウントに値を挿入するトリガを設定したいとします。また、PK customerIDが自動的にACCOUNTのcustomerIDに割り当てられます。外部キー。

私はSQLとデータベースを勉強していますが、その答えが明白であれば私をよろこんでください。 大変助かりました!

答えて

0

ACCOUNTの外部キーはCUSTOMERのプライマリキーですので、これが有効です。 :newキーワードに注意してください。これは、現在のレコードの値を参照する方法であり、 "テーブルの変更"エラーを回避する方法です。

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

関連する問題