2013-10-31 56 views
0

我無法找到解決構建獨特索引表的問題的方法。獨特索引的故障構造表

我有哪裏的項目被保留一個表,但是也有一些用於彌補

ItemID - INT 
Date - DATE 
TimeOfDay - INT (morning = 1, afternoon = 2) 
ReservationStatus - VARCHAR (expired, cancelled, confirmed, cancelled by admin) 

的問題是與reservationStatus字段進行多個領域。系統應該允許多行被取消,但只有一行被確認或過期(應用程序從確認變爲過期)。我出來的想法,任何幫助將不勝感激。

編輯:

全表結構

ReservationID - PK Auto-incrementing Integer 
SubItemID - INT FK 
MemberID - INT FK 
Date - DATE 
TimeOfDay - INT 
ReservationStatus - VARCHAR 

SubItemID,日期的TimeOfDay,更改爲reservationStatus必須是唯一的:一個以上的成員不能預留相同的子項下午在同一天。

我通過我的應用程序驗證了這一點,但是我想通過表結構來確保完整性(在程序員錯誤的情況下)。

+0

這是整桌嗎?是否有與每行相關的用戶ID?你是否考慮過使用ENUM來保留狀態而不是VARCHAR? – ModulusJoe

+0

_「對於同一個'ItemID',系統應該允許多行被取消」_?另外,桌子的PK是什麼? – geomagas

+0

@acyclic - 我省略了其他字段,請參閱編輯。請原諒我,但我對ENUM不熟悉,現在將對此進行研究。 – Raythe

回答

2

要在此表結構中實現具有唯一鍵約束的業務規則,您將不得不做一些稍微不自然的事情。

您可以添加一個名爲CancellationCode的列。把它變成一個INT。保留該列中的值0意味着活動/過期,並將其作爲默認值。然後,如果您取消預訂,請將唯一的非零值分配給該行中的取消代碼。您可以在該行的行中使用您的ReservationID值,或者可以使用具有其自己唯一標識的「取消」表。

您可以保留您的ReservationStatus列,以便您可以瞭解預訂情況。但是,當您查找有效/過期的預訂時,請使用WHERE CancellationCode = 0,以防萬一CancellationCode和ReservationStatus不同步。

然後讓自己成爲(SubItemId,Date,TimeOfDay,CancellationNumber)上的唯一索引。這將阻止嘗試爲現有行的SubItemId,Date,TimeOfDay值的相同組合插入新的活動保留行。

+0

非常容易實現的令人難以置信的答案。非常感謝,如果能夠的話,我會加倍努力。 – Raythe

+0

不客氣,先生。 –