麻烦为唯一索引构造表

时间:2013-10-31 16:11:49

标签: mysql normalization unique-index

我无法通过为唯一索引构建表来找到解决问题的方法。

我有一个表格,其中保留了项目,并且有几个用于组成的字段

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,Date,TimeOfDay,ReservationStatus需要是唯一的:多个成员在同一天下午不能保留相同的SubItem。

我通过我的应用程序验证了这一点,但是我希望通过表结构确保完整性(在程序员错误的情况下)。

1 个答案:

答案 0 :(得分:2)

要在此表结构中使用唯一键约束实现此业务规则,您将不得不做一些稍微不自然的事情。

您可以添加名为CancellationCode的列。使它成为INT。将该列中的值0保留为表示活动/已过期,并将其设为默认值。然后,如果取消预留,请为该行中的CancellationCode分配唯一的非零值。您可以在行中使用您的ReservationID值,或者您可以使用具有自己唯一ID的Cancellation表。

您可以保留您的ReservationStatus列,以便了解预订的进展情况。但是,当您查找活动/过期预订时,请使用WHERE CancellationCode = 0,以防CancellationCode和ReservationStatus不同步。

然后在(SubItemId,Date,TimeOfDay,CancellationNumber)上创建一个唯一索引。这将阻止任何尝试为SubItemId,Date,TimeOfDay值的相同组合插入新的活动保留行作为现有行。