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、Date、TimeOfDay、ReservationStatus 需要唯一:同一天下午不能有多个会员预订同一个SubItem。

我通过我的应用程序验证了这一点,但是我想通过表结构确保完整性(以防程序员出错)。

4

1 回答 1

2

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

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

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

然后让自己成为(SubItemId、Date、TimeOfDay、CancellationNumber)上的唯一索引。这将阻止为与现有行相同的 SubItemId、Date、TimeOfDay 值组合插入新的活动预留行的任何尝试。

于 2013-10-31T17:49:16.653 回答