Oracle PL / SQL多个插入没有重复值

时间:2016-04-04 03:41:27

标签: oracle plsql triggers insert

我有桌面评论书表。用户需要为bookid分配3个不同的评论成员。它们可以是任何reviewmemberid,只要它们是3个不同的一个bookid。以下是我想要的结果。现在,我能想到的是在查询中进行多次插入,但是,reviewmemberid可以重复,这不是我想要的。我听说触发器可以这样做,但我不知道如何应用它。有人可以引导我,或者可能有更好的方法来做这件事。

   Reviewbook
   -reviewid
   -reviewmemberid
   -bookid

  reviewid  reviewmemberid  bookid
      1           2           1     
      2           3           1
      3           5           1
      4           1           2 
      5           2           2
      6           5           2
      7           1           3
      8           2           3
      9           4           3    



//My current insert code, but this insert code can insert duplicate reviewmemberid.
INSERT ALL INTO REVIEW (REVIEWID,REVIEWMEMBERID,BOOKID)VALUES
(?.?,?) INTO REVIEW
(REVIEWID,REVIEWMEMBERID,BOOKID)VALUES 
(?.?,?) INTO REVIEW
(REVIEWID,REVIEWMEMBERID,BOOKID)VALUES 
(?.?,?) SELECT * FROM DUAL;

2 个答案:

答案 0 :(得分:2)

另一种选择是简单地在列(REVIEWMEMBERID,BOOKID)上声明唯一索引。语法是

CREATE UNIQUE INDEX book_reviewer_idx
  ON review (reviewmemberid, bookid);

这将确保(reviewmemberid, bookid)的特定配对在表格中仅出现一次;尝试插入重复项会引发错误。

答案 1 :(得分:0)

here

中所述,有多种方法可以做到这一点

基于您的表架构并假设您要插入元组(1,10,3)

 Reviewbook
   -reviewid : 1 
   -reviewmemberid : 10 
   -bookid : 3 

以下是一些如何操作的示例。

选项1

INSERT INTO table
SELECT 1,10,3
  FROM dual -- Not Oracle? No need for dual, drop that line
 WHERE NOT EXISTS (SELECT NULL -- canonical way, but you can select
                               -- anything as EXISTS only checks existence
                     FROM table
                    WHERE reviewmemberid = 10
                  )

选项2

您可以在reviewmemberid上设置唯一约束。

CREATE TABLE table_name (
 ... 
  reviewmemberid number UNIQUE, 
 ... 
); 

  BEGIN
  INSERT INTO table( reviewid, reviewmemberid, bookid )
    VALUES( 1, 10, 3);
EXCEPTION
  WHEN dup_val_on_index
  THEN
    NULL; -- Intentionally ignore duplicates
END;