【问题标题】:Multitable constraints in SQL ServerSQL Server 中的多表约束
【发布时间】:2020-07-17 07:18:00
【问题描述】:

我有一个包含 2 个表的数据库(主键是斜体):

  • ROOM(ROOM_ID,DAY,HOUR)
  • 预订(CUSTOMER_ID,ROOM_ID,日期)

第一个表格描述了房间的可用性和客户进行的第二个预订。

现在假设我在ROOM 中插入了 3 行:

3898   WEDNESDAY   2.00
3454   MONDAY      1.00
3563   MONDAY      1.00

两行变成RESERVATION:

0898   3454   05-09-2019 
0567   3898   05-08-2019  

现在我想创建一个约束,不允许已经预订房间的客户预订另一个同时可用的房间!

如果我尝试插入:

0567   3563   05-10-2019  

我会收到一个错误,因为根据第一张桌子,房间 3454 和 3563 都在 1.00 可用。

谢谢!

【问题讨论】:

  • 我认为唯一的自动解决方案是有一个触发器,我不建议这样做。这是您应该在您的应用程序或执行插入的存储过程内部检查的内容。
  • MYSQL 和 SQLSERVER 非常不同。您应该删除不适当的标签,或者如果您想要同时解决这两个问题,您应该这样说。
  • 预订和房间之间没有有用的关系,因为房间不知道可用的日期,而预订也不知道所需的时间。鉴于此,只需在 customer_id 和日期的预订中创建一个唯一键。
  • "现在我想创建一个约束,不允许已经预订房间的客户预订另一个同时可用的房间!" - 就像有人说“哦,我们带着孩子来,请给我两个房间”?这个要求至少对我来说听起来很糟糕,并且完全没有考虑到你为一个客户预订多个房间的现实世界场景。小心你真的想要这个 - 因为我可以想到很多原因我确实同时预订了多个房间。
  • 补充一点,你的名字并不反映你的模型。 “房间”这个名字很糟糕,因为它反映了房间在给定(但非常有缺陷的)时间段内的可用性。请注意,您的描述中隐含了“句号”-这真的是您系统的限制吗?正如其他人已经说过的那样,您应该真正考虑您的模型。

标签: sql sql-server


【解决方案1】:

现在我想创建一个约束条件,不允许已经预订房间的客户预订另一个同时可用的房间。

我将此解释为客户在每个日期只能预订一个房间。如果是这样,您可以在reservation 上(customer_id,date)使用唯一索引/约束来执行此操作:

create unique index unq_reservation_customer_date on reservation(customer_id, date);

这保证给定客户在每个日期只能预订一个房间。

【讨论】:

  • 如何防止插入“0567 3563 05-10-2019”记录?
  • @AntonínLejsek 。 . .如果表中已经有 0567/05-10-2019 的行。
【解决方案2】:

我可以看到两种创建真正约束的方法:

  1. 您创建两个表的具体化视图并在此视图上添加唯一索引。
  2. 您将 ROOM_DAY 和 ROOM_HOUR 列添加到 RESERVATION 表中,然后 添加复合外键约束以强制数据完整性:
ALTER TABLE RESERVATION WITH CHECK ADD CONSTRAINT FK_RESERVATION_ROOM 
FOREIGN KEY(ROOM_ID, ROOM_DAY, ROOM_HOUR)
REFERENCES ROOM (ROOM_ID, DAY, HOUR)

请注意,您也必须启用它。然后您可以在 RESERVATION 表上添加唯一索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多