防止根据日期范围插入 ID ORACLE SQL

Prevent Inserting an id based on date range ORACLE SQL

我正在寻找具有特定 ID 的 table:

CREATE TABLE ID (
    IDRef NUMBER (5, 0) NOT NULL
CONSTRAINT ID_PK PRIMARY KEY (IDRef));

另一个 table 具有日期范围(和其他值)

CREATE TABLE CALENDAR (
    DateStart DATE NOT NULL,
    DateEnd DATE NOT NULL,
    IDRef NUMBER (5, 0) NOT NULL,
CONSTRAINT ID_PK FOREIGN KEY (IDRef) REFERENCES ID(IDRef));

我想对其进行设置,以便只有在不与日期范围(开始日期 - 结束日期)重叠的情况下才能输入特定 ID。

因此,如果这样插入 ID 1 和 2,我预计会出现以下情况:

INSERT INTO CALENDAR VALUES (10-Jan-21, 14-Jan-21, 1); --> **SUCCESS**
INSERT INTO CALENDAR VALUES (10-Jan-21, 14-Jan-21, 2); --> **SUCCESS**
INSERT INTO CALENDAR VALUES (12-Jan-21, 13-Jan-21, 1); --> **FAIL**
INSERT INTO CALENDAR VALUES (15-Jan-21, 19-Jan-21, 1); --> **SUCCESS**
INSERT INTO CALENDAR VALUES (15-Jan-21, 19-Jan-21, 2); --> **SUCCESS**

Oracle 上的 SQL 可以做到这一点吗?

您肯定需要一个触发器来执行所需的规则。你可以尝试触发 -

CREATE OR REPLACE TRIGGER TRIG_INSERT_CALENDAR
AFTER INSERT
ON CALENDAR
DECLARE
       NUM_FLAG NUMBER := 0;
       INVALID_ROW EXCEPTION;
       PRAGMA EXCEPTION_INIT(INVALID_ROW, -20999);
BEGIN
     
     SELECT COUNT(*)
       INTO NUM_FLAG
       FROM CALENDAR C1
      WHERE EXISTS (SELECT NULL
                      FROM CALENDAR C2
                     WHERE C1.IDRef = C2.IDRef
                       AND ((C2.DateStart > C1.DateStart AND
                            C2.DateStart < C1.DateEnd) OR 
                            (C2.DateEnd > C1.DateStart AND
                            C2.DateEnd < C1.DateEnd)));
        
     IF NUM_FLAG > 0 THEN
        RAISE INVALID_ROW;
     END IF;
END;
/

Demo.