我想創建以下2個表,其中的開始日期必須在結束日期之前:根據外鍵連接的行的行值,在SQL Server中添加檢查?
CREATE TABLE ParentEntity
(
ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
StartDate date NOT NULL,
EndDate date NOT NULL,
Description varchar(255)
);
ALTER TABLE ParentEntity
ADD CHECK (DATEDIFF(day,StartDate ,EndDate) > 0)
CREATE TABLE ChildEntity
(
ID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
Parent int NOT NULL FOREIGN KEY REFERENCES ParentEntity (ID),
StartDate date NOT NULL,
EndDate date NOT NULL,
Description varchar(255)
);
ALTER TABLE ChildEntity
ADD CHECK (DATEDIFF(day,StartDate ,EndDate) > 0)
現在我想添加這個檢查:StartDate
每個ChildEntity
行內必須發生的EndDate
對應的ParentEntity
行的StartDate
和EndDate
之間的日期間隔。
如何進行此項檢查?我不知道如何引用通過外鍵定義的行。
分開約束'約束UQ_ParentEntity_Dates UNIQUE(ID,StartDate,EndDate)'的功能是什麼,因爲我已經有一個ID定義爲主鍵?簡短的檢查更優雅,我一定會使用它,並命名它們也是很好的建議。孩子只在家長更新時才更新?如果我嘗試將ChildEntity中的'ParentStart'更新爲與實際ParentEntity StartDate不同的值,會發生什麼情況?最後一個問題:我可以爲每個ParentEntity創建多個ChildEntity。我認爲你的例子是更新孩子的ID值,這不應該發生,這是正確的嗎? –
@DaniëlCamps - 對不起,FK應該在'Parent,ParentStart,ParentEnd'上,而不是使用'ID'。現在更正。並且父對象的'UNIQUE'約束的目的是允許使用FK約束在父對象和子對象之間檢查所有這三個列*。 –
我最終命名了所有約束,將所有約束聲明放在CREATE TABLE子句中,使用更簡單的日期檢查,我使用子父母日期檢查。 –