【问题标题】:Check Constraint in Oracle SQL Developer在 Oracle SQL Developer 中检查约束
【发布时间】:2016-06-07 19:53:08
【问题描述】:

需要你的帮助

我在 Oracle SQL Developer 中有一个这样的表:

问题 ID|Subscriber_ID|Book_ID|拍摄 |返回 --+-------------+--------+--------+-------- 1 | 1 | 2 |01-06-16|05-06-16 2 | 3 | 5 |07-05-16| (无效的) 3 | 2 | 2 |06-06-16| (无效的) 4 | 1 | 3 |17-05-16|26-05-16

这是某种图书馆图书发行,其中已归还列中的 (null) 表示这本书尚未归还。我需要创建验证规则以避免发行未归还的书(例如,我现在不能拿书 #5)。如何实现?

【问题讨论】:

  • 你不能。不作为约束。您可以创建一个函数/过程来执行此操作。无法创建约束来检查以前的行。功能会为您服务吗?

标签: sql oracle ddl check-constraints


【解决方案1】:

嗯。您不能使用 check 约束来执行此操作,因为这些仅适用于一行中的值。

您要确保一本书没有两个返回值。一些数据库支持过滤的唯一索引:

create unique index on unq_issue_bookid on issue(book_id) where returned is null;

但不是甲骨文。您可以使用基于函数的索引执行非常类似的操作:

create unique index on unq_issue_bookid_returned
    on issue(book_id,
             (case when returned is not null then id else -1 end)
            );

这将具有相同的效果,即每本书只允许一个 NULL 值。

【讨论】:

    【解决方案2】:

    你可以这样做:

    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 );
    

    然后:

    INSERT INTO table_name ( ID, Subscriber_ID, Book_ID, Taken )
    VALUES ( 5, 2, 5, DATE '2016-06-06' );
    

    将失败:

    SQL Error: ORA-00001: unique constraint (TEST.IS_BORROWED__U) violated
    

    【讨论】:

    • 谢谢,但是这个解决方案不起作用,因为当图书被退回时,您无法再次退回(pair (book_id, null) 也必须是唯一的)
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2020-05-09
    相关资源
    最近更新 更多