0

我有以下表格设置:

CREATE TABLE IF NOT EXISTS `appointment` (
  `idappointment` int(11) NOT NULL AUTO_INCREMENT,
  `appdate` datetime NOT NULL,
  `appnote` varchar(255) DEFAULT 'Please enter a relevant note',
  `chair_idchair` int(11) NOT NULL,
  PRIMARY KEY (`idappointment`,`chair_idchair`),
  KEY `fk_appointment_chair_idx` (`chair_idchair`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;

appdate该字段的 典型值为:2013-07-05 08:30:00因此 2013-07-05 09:00:00 没有时间戳值,并且所有约会都以固定的时间间隔不同。

对于我的应用程序,我需要确保没有一个椅子在同一时间间隔被双重预订,因此我想创建一个由appdate字段和chair_idchair字段组成的复合主键,然后将此复合主键设置为唯一。

我的问题是如何在 MySQL 中做到这一点,更重要的是,它实际上是确保不能从 DB 方面预订双重预订的最佳方式。我不想仅仅依靠应用程序来执行此检查,因为用户将同时从多个位置进行预订。

4

2 回答 2

1

制作包含的复合主键appdatechair_idchair不能解决问题。如果一个条目的 appdate2013-07-05 08:30:00则允许另一个条目与 appdate2013-07-05 08:31:00相同的椅子 ID,这是不正确的。

为了克服这个问题,在插入任何条目之前,您需要通过查询检查是否有任何约会的时间与当前约会重叠,然后只有您应该允许插入。

例如,如果一个约会的持续时间是 30 分钟,那么在插入任何约会之前,您必须检查同一主席是否有任何时间少于新约会时间的 30 分钟的约会。

TIMEDIFF()mysql的功能可以帮助你。

于 2013-07-05T06:34:52.770 回答
0

正如 Darshan 所指出的,像这样的复合索引不会强制appdate. 您最好使用自动增量列进行 PK。并添加另一个索引appdate(必要时唯一)。

这样它就很容易实现,当您的客户决定您需要appdate在数据库中拥有 2 条相同的记录时,更改也将更容易。

如果您想appdate通过数据库强制执行唯一性,您可以创建一个插入/更新前触发器以规范化的值appdate(例如 - 从2013-07-05 12:33:41' to2013-07-05 12:30:00 转换它)。然后给索引加上一个唯一的约束。

于 2013-07-05T06:47:35.530 回答