[英]Check Constraint in Oracle SQL Developer
need your help 需要你的帮助
I have a table in Oracle SQL Developer of this kind: 我在Oracle SQL Developer中有一个这样的表:
Issue ID|Subscriber_ID|Book_ID| Taken |Returned --+-------------+-------+--------+-------- 1 | 1 | 2 |01-06-16|05-06-16 2 | 3 | 5 |07-05-16| (null) 3 | 2 | 2 |06-06-16| (null) 4 | 1 | 3 |17-05-16|26-05-16
It's some sort of library book issuing where (null) in Returned column means that this book wasn't returned yet. 这是某种形式的图书馆图书发行,其中“返回”列中的(空)表示该图书尚未归还。 I need to create validation rule to avoid issuing book that wasn't returned (eg I can't take the book #5 at the moment).
我需要创建验证规则,以避免发行未归还的书(例如,目前我不能拿5号书)。 How can I implement it?
我该如何实施?
Hmmm. 嗯 You can't do this with a
check
constraint, because those only apply to values in one row. 您不能使用
check
约束来执行此操作,因为这些约束仅适用于一行中的值。
What you want to ensure is that you do not have two returned values for a book. 您要确保的是,您没有一本书的两个返回值。 Some databases support filtered unique indexes:
一些数据库支持过滤后的唯一索引:
create unique index on unq_issue_bookid on issue(book_id) where returned is null;
But not Oracle. 但不是甲骨文。 You can do something very similar with a function-based index:
您可以使用基于函数的索引执行非常相似的操作:
create unique index on unq_issue_bookid_returned
on issue(book_id,
(case when returned is not null then id else -1 end)
);
This will have the same effect of allowing only one NULL
value per book. 这将具有与每本书只允许一个
NULL
值相同的效果。
You can do it with : 您可以使用:
CREATE TABLE table_name ( ID, Subscriber_ID, Book_ID, Taken, Returned ) AS
SELECT 1, 1, 2, DATE '2016-06-01', DATE '2016-06-05' FROM DUAL UNION ALL
SELECT 2, 3, 5, DATE '2016-05-07', NULL FROM DUAL UNION ALL
SELECT 3, 2, 2, DATE '2016-06-06', NULL FROM DUAL UNION ALL
SELECT 4, 1, 3, DATE '2016-05-17', DATE '2016-05-26' FROM DUAL;
ALTER TABLE table_name ADD is_borrowed
GENERATED ALWAYS AS ( CASE WHEN returned IS NULL THEN 1 END ) VIRTUAL;
ALTER TABLE TABLE_NAME ADD CONSTRAINT is_borrowed__u
UNIQUE( book_id, is_borrowed );
Then: 然后:
INSERT INTO table_name ( ID, Subscriber_ID, Book_ID, Taken )
VALUES ( 5, 2, 5, DATE '2016-06-06' );
Will fail with: 失败的原因:
SQL Error: ORA-00001: unique constraint (TEST.IS_BORROWED__U) violated
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.