我有以下問題:我有一個酒店的數據庫,我必須在預訂房間時處理碰撞。函數在查詢中工作,但不在約束中
所以我們假設Quest1想在2016-11-10和2016-11-15之間預訂房間2,但是這個房間在2016-11-07和2016-11-14之間已經被Quest3預訂了(您可以預訂房間離開人們的那一天),我的功能應該被稱爲約束,以告訴他不能爲這些日期預訂它。
我有一個EMPTY表預訂。問題是,在查詢中使用該函數時,它返回的是room2在2016-11-10和2016-11-15之間預訂了0次(因爲該表爲空,即使它不爲空,它也會返回),但是在使用它作爲約束時,它會在行未更新時出現,插入語句與我的約束衝突。
功能:
ALTER FUNCTION [dbo].[Booked]
(
@room int,
@from date,
@to date
)
RETURNS int
AS
BEGIN
return(
SELECT count(*)
FROM BOOKINGS
WHERE room = @room AND NOT (@from >= to OR @to < from)
)
END
約束:
ALTER TABLE BOOKINGS ADD
CONSTRAINT chk_isBooked
CHECK ([dbo].Booked([room], [from],[to])=(0))
提前感謝!
您能指定完整的約束定義嗎? –
是的!對不起,我完全忘了添加那個。 ALTER TABLE BOOKINGS 添加約束chk_isBooked CHECK([dbo]。[Booked]([room], [(from],[to])=(0)) – meph
我真的不這麼認爲,知道如何創建一個函數和一個支票,我的問題是,即使我創建了一個返回正確值的工作函數,這個約束似乎是偏離軌跡的。 對不起,如果我沒有足夠具體的話 – meph