在Oracle触发器中合并表时插入重复项

时间:2014-03-25 11:24:43

标签: oracle oracle10g

我有两张桌子,比如测试和书籍。我的任务是创建一个Oracle触发器,它可以在将测试合并到书籍时避免/防止重复。没有错误,但重复插入

我的表格:

books: book_id(PK), book_name, author, no_of_copies
test : book_id, book_name, author, no_of_copies, CMT

触发:

CREATE OR REPLACE TRIGGER tri_books_edit
BEFORE INSERT ON books
REFERENCING NEW AS N 
FOR EACH ROW MODE DB2SQL
WHEN ((select count(*) from books where book_name = N.book_name and author = N.Author) > 0)
BEGIN
    rollback; 
END 

**MERGE STAMTEMENT**

Merge the test to books and remove the duplicates of book_name and author 
rows from test to books

MERGE INTO books AS b 
USING (select book_id, book_name, author, no_of_copies from test where book_id >= 12) AS t
ON b.book_id = t.book_id
WHEN MATCHED THEN 
UPDATE SET no_of_copies = b.no_of_copies + t.no_of_copies
WHEN NOT MATCHED THEN
INSERT (book_id, book_name, author, no_of_copies)
    VALUES (t.book_id, t.book_name, t.author, t.no_of_copies);



Result :Trigger is not invoking and duplicates are inserting in books table.

1 个答案:

答案 0 :(得分:0)

创建一个类似于books_and_test的新表(包含您不想复制的字段),在多个字段上添加唯一索引... 在书籍上的触发器中,测试(每个表的触发器)在插入书籍之前添加语句,将插入值测试到books_and_test中,并在唯一索引违例时使用catch异常。什么时候会有重复,然后做一些你想要的异常或什么...... 这可行,但也许有更好的解决方案...... 更好地避免触发器并尝试使用函数搜索约束以检查函数中的重复项。