我有桌面评论书表。用户需要为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;
答案 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
以下是一些如何操作的示例。
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
)
您可以在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;