【问题标题】:Inserting duplicates while merging the tables in Oracle triggers在合并 Oracle 触发器中的表时插入重复项
【发布时间】:2014-03-26 00:47:41
【问题描述】:

我有两张桌子,分别是 test 和 books。我的任务是创建一个 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.

【问题讨论】:

  • 如果可能,您应该使用唯一索引来防止重复。
  • 如果您想合并记录,那么为什么要使用触发器,您可以使用 MERGE 语句来实现此目的。请提供有关您的要求的更多详细信息。
  • 当你使用 MERGE 语句时,会出现什么样的错误?您可能需要更新您的问题和标题,否则任何一个问题都将被关闭或被标记。
  • 我已经更改了问题和正文。我没有收到任何错误,但正在插入重复项。我想要一个触发器,它在两个表之间发生合并时不允许重复。 EOD,我的目标是看到我的表具有唯一的书名和作者值..
  • @user3454735 检查这个post,看看这是否有用。

标签: oracle oracle10g


【解决方案1】:

创建一个新表,例如 books_and_test(包含您不想复制的字段),在多个字段上添加唯一索引... 在书籍上的触发器中,测试(每个表的触发器)在插入书籍之前添加语句,测试将值插入到书籍和测试中,并在唯一索引违规时捕获异常。当将有重复时,请在异常中执行您想要的操作或什么都不做... 这可行,但也许有更好的解决方案...... 最好避免触发器并尝试使用函数搜索约束以检查函数中的重复项..

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2014-06-28
    • 1970-01-01
    • 2014-05-07
    • 2018-03-25
    • 2011-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多