我有一個名為 Project 的表,其中包含開始日期和結束日期。我還有一個名為 Plan 的表,它有自己的開始和結束日期列。但我以某種方式驗證計劃開始/結束日期在匹配的專案開始/結束日期之間。
我不知道在創建表或向計劃表插入行時添加檢查是否合適。到目前為止,我都嘗試過,但都沒有運氣。
下面的代碼給了我一條錯誤訊息沒有這樣的列。有誰知道如何解決這個問題?提前致謝。
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)
);
uj5u.com熱心網友回復:
你需要一個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)
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361350.html
