在Oracle触发器中合并表时插入重复项
我有两张桌子,比如说考试和书本。我的任务是创建一个Oracle触发器,它将在将测试合并到书本时避免/防止重复。无错误,但正在插入重复项 我的桌子:在Oracle触发器中合并表时插入重复项,oracle,oracle10g,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 REFERE
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.
触发器:
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.
创建一个新表,比如books_和_test(包含您不想复制的字段),在多个字段上添加唯一索引。。。 在“书本上的触发器”中,test(每个表的触发器)在“书本上的插入”之前添加语句,在“书本上的插入”中测试“值”,并在“唯一索引冲突”上测试“捕获异常”。当有重复,然后做一些你想在例外或什么都没有。。。 这是可行的,但也许有更好的解决方案。。。
最好避免触发器,并尝试使用函数搜索约束以检查函数中的重复项。如果可能,您应该使用唯一索引来防止重复项。如果您希望合并记录,那么为什么要使用触发器,您可以使用merge语句来实现这一点。请提供有关您的要求的更多详细信息。当您使用合并语句时,会出现什么样的错误?您可能需要更新您的问题和标题,否则问题将被关闭或被标记。我已更改了问题和正文。我没有得到任何错误,但重复插入。我想要一个触发器,它在两个表之间进行合并时不允许重复。EOD,我的目标是查看具有唯一值bookname和author的表。@user3454735检查此项,查看此项是否有用。