我有一張表,其中包含一個人的日期和更多數據的列表。該表不應該有任何未刪除的重疊行(日期重疊)。插入/更新時檢查重疊日期
有沒有一種方法可以在表上設置檢查約束,以確保當我更新或插入一行時,沒有重疊的細節?
下面是我的桌子的減少版本。它有一個已刪除的標誌和開始/結束日期。 「空」結束日期表示正在進行。
然後我提供了一些法律和一些不那麼合法的插入(以及爲什麼它們是合法的和非法的)。
DECLARE @Test TABLE
(
Id INT NOT NULL IDENTITY(1,1),
PersonID INT NOT NULL,
StartDate DATE NOT NULL,
EndDate DATE NULL,
Deleted BIT NOT NULL
)
INSERT INTO @Test
(PersonId, StartDate, EndDate, Deleted)
SELECT 1, '01-JAN-2015', '15-JAN-2015', 0 UNION ALL -- Valid
SELECT 1, '16-JAN-2015', '20-JAN-2015', 1 UNION ALL -- Valid and deleted
SELECT 1, '18-JAN-2015', NULL, 0 UNION ALL -- Valid
SELECT 2, '01-JAN-2015', NULL, 0 UNION ALL -- Valid.. never ending row.
SELECT 2, '18-JAN-2015', '30-JAN-2015', 0 UNION ALL -- Invalid! Overlaps above record.
SELECT 2, '20-JAN-2015', '30-JAN-2015', 1 UNION ALL -- Valid, as it's deleted (Still overlaps, though)
SELECT 3, '01-JAN-2015', '10-JAN-2015', 0 UNION ALL -- Valid
SELECT 3, '10-JAN-2015', NULL, 0 -- Invalid, as it overlaps the last and first days
SELECT * FROM @Test
我需要確保該表不允許同一個人的重疊日期,對於未刪除的行。
對於日期範圍檢查,我將使用「(StartA < = EndB)和(EndA> = StartB)」公式,但不確定如何使用約束和跨多行檢查此問題。
我可能需要做一個觸發器,通過檢查insertion.values退出,並以某種方式取消,如果我找到匹配?