防止根据日期范围插入 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;
/
我正在寻找具有特定 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;
/