在插入 SQLite 之前检查 table B 中的日期是否在 Table A 中的日期之间
Checking if date in table B is between date in Table A before inserting SQLite
我有一个 table 名为 Project 的开始和结束日期。我还有一个名为 Plan 的 table,它有自己的开始日期和结束日期列。但我有一些方法可以验证计划 start/end 日期是否在匹配的项目 start/end 日期之间。
我不知道在创建 table 或向计划 table 中插入行时添加检查是否合适。到目前为止,我都尝试过但没有成功。
下面的代码给我一条错误消息,没有这样的列。有谁知道如何解决这个问题?提前致谢。
https://i.stack.imgur.com/UC5Ai.png
%%sql
DROP TABLE IF EXISTS Plan;
CREATE TABLE Plan (
pID varchar(255) NOT NULL UNIQUE,
projectID varchar(255) NOT NULL UNIQUE,
name varchar(255) NOT NULL DEFAULT ' ',
startDate DATE NOT NULL DEFAULT '2000-12-31',
endDate DARE NOT NULL DEFAULT '2000-12-31'
CHECK (JulianDay(startDate) <= JulianDay(endDate) AND (startDate >= Project.startDate) AND
(endDate <= Project.endDate)),
PRIMARY KEY (pID, projectID),
FOREIGN KEY (projectID) REFERENCES Project(projectID)
);
您需要一个 BEFORE INSERT
触发器:
CREATE TRIGGER trg_ins_plan BEFORE INSERT ON Plan
BEGIN
SELECT
CASE
WHEN NOT EXISTS (
SELECT 1
FROM Project p
WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
)
THEN RAISE(ABORT, 'Invalid dates')
END;
END;
和一个 BEFORE UPDATE
触发器:
CREATE TRIGGER trg_upd_plan BEFORE UPDATE ON Plan
BEGIN
SELECT
CASE
WHEN NOT EXISTS (
SELECT 1
FROM Project p
WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
)
THEN RAISE(ABORT, 'Invalid dates')
END;
END;
此外,将日期的 CHECK
约束更改为:
CHECK (JulianDay(startDate) <= JulianDay(endDate))
或者只是:
CHECK (startDate <= endDate)
参见demo。
我有一个 table 名为 Project 的开始和结束日期。我还有一个名为 Plan 的 table,它有自己的开始日期和结束日期列。但我有一些方法可以验证计划 start/end 日期是否在匹配的项目 start/end 日期之间。
我不知道在创建 table 或向计划 table 中插入行时添加检查是否合适。到目前为止,我都尝试过但没有成功。
下面的代码给我一条错误消息,没有这样的列。有谁知道如何解决这个问题?提前致谢。
https://i.stack.imgur.com/UC5Ai.png
%%sql
DROP TABLE IF EXISTS Plan;
CREATE TABLE Plan (
pID varchar(255) NOT NULL UNIQUE,
projectID varchar(255) NOT NULL UNIQUE,
name varchar(255) NOT NULL DEFAULT ' ',
startDate DATE NOT NULL DEFAULT '2000-12-31',
endDate DARE NOT NULL DEFAULT '2000-12-31'
CHECK (JulianDay(startDate) <= JulianDay(endDate) AND (startDate >= Project.startDate) AND
(endDate <= Project.endDate)),
PRIMARY KEY (pID, projectID),
FOREIGN KEY (projectID) REFERENCES Project(projectID)
);
您需要一个 BEFORE INSERT
触发器:
CREATE TRIGGER trg_ins_plan BEFORE INSERT ON Plan
BEGIN
SELECT
CASE
WHEN NOT EXISTS (
SELECT 1
FROM Project p
WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
)
THEN RAISE(ABORT, 'Invalid dates')
END;
END;
和一个 BEFORE UPDATE
触发器:
CREATE TRIGGER trg_upd_plan BEFORE UPDATE ON Plan
BEGIN
SELECT
CASE
WHEN NOT EXISTS (
SELECT 1
FROM Project p
WHERE p.projectID = NEW.projectID AND p.startDate <= NEW.startDate AND p.endDate >= NEW.endDate
)
THEN RAISE(ABORT, 'Invalid dates')
END;
END;
此外,将日期的 CHECK
约束更改为:
CHECK (JulianDay(startDate) <= JulianDay(endDate))
或者只是:
CHECK (startDate <= endDate)
参见demo。