2016-02-28 29 views
0

我想知道如何編寫一個觸發器,它只會在你想插入的值不存在時才被激活,並且我需要在它添加之前在另一個表中創建一個引用。我一直在爲這個當前的代碼得到一個錯誤。如何僅在表中不存在值時激活SQL觸發器?

CREATE OR REPLACE TRIGGER CreateConversation 
    BEFORE INSERT ON Messages 
    FOR EACH ROW 
    WHEN (NOT EXISTS (select convID FROM Conversation where new.convID = convID)) 
    BEGIN 
     INSERT INTO Conversation (convID, msgID) VALUES(:new.convID, :new.msgID); 
    END; 
/

有什麼建議嗎?

回答

0

你的數據模型似乎有點奇怪。但是,如果你插入CONVERSATION的行是唯一的,那麼一個簡單的方法就是每次嘗試插入。如果該值已經存在,則會引發dup_val_on_index異常,您可以忽略該異常。

CREATE OR REPLACE TRIGGER CreateConversation 
    BEFORE INSERT ON Messages 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO Conversation (convID, msgID) VALUES(:new.convID, :new.msgID); 
    EXCEPTION 
     WHEN dup_val_on_index THEN 
     NULL; 
    END; 
/
+0

謝謝你的回覆!不幸的是,我得到一個ORA-04098錯誤 – Kaska

+0

該錯誤似乎來自「INSERT INTO對話行.....」但我不知道我輸入錯誤。在另一個觸發器中,我有一個表的UPDATE語句,它工作正常。當表格對話改變時,我沒有任何觸發器。 – Kaska

+0

以顯而易見的方式開始:在DBA_TRIGGERS中查找無效的兩個表「MESSAGES」或「CONVERSATION」中的任何觸發器。它不一定是你已經提到的兩個觸發器之一。 –

相關問題