Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle触发器中合并表时插入重复项_Oracle_Oracle10g - Fatal编程技术网

在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

我有两张桌子,比如说考试和书本。我的任务是创建一个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.
触发器:

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检查此项,查看此项是否有用。