Mysql跨表的多个唯一键

时间:2013-05-14 20:56:07

标签: mysql sql database unique-key

我有一张这样的表:

CREATE TABLE `Appointment` (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    doctor_slot_id INT NOT NULL,
    date DATE NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(user_id) REFERENCES user(id),
    FOREIGN KEY(doctor_slot_id) REFERENCES doctor_slot(id)
);

我希望用户不能在一天内安排多次与医生预约。所以我想在doctor_id和user_id之间添加一个唯一的约束,但在这个结构中我不能。我尝试了那些不是SQL语法的东西:

UNIQUE(user_id, doctor_slot.doctor_id)

UNIQUE(user_id, doctor_slot(doctor_id))

UNIQUE(user_id, doctor_id(doctor_slot))

但是如你所知,他们没有工作。你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

根据您对doctor_slot的评论,您可能会对架构设计存在一些问题。你应该没有理由在提交表中存储slot_id和日期,因为doctor_slot已经有一个日期组件,因此将日期存储在约会表中是一个冗余的数据存储,并且可能会成为问题。保持同步。

当然,如果没有此表上的日期,则无法在此表的数据库中强制使用唯一约束。

我建议任何类型的基于日历的应用程序都是首先创建一个日期表。我通常使用像这里的脚本http://www.dwhworld.com/2010/08/date-dimension-sql-scripts-mysql/来创建这个日期表。拥有这样的表可以允许您使用简单的date_id来引用有关日期的各种不同信息(这是数据仓库中常用的一种技术)。只要您在需要日期的所有其他表格中使用此date_id,就可以非常简单地查看您想要的任何时间的日期(按星期,月份,星期数,是否是工作日等) )。

您可以使用类似的概念来构建时间段。也许制作一个有96个条目(24小时* 15分钟)的表来表示15分钟的时间间隔 - 显然你可以将它改为你喜欢的任何时间间隔。

然后您可以像这样构建约会表:

appointment_id
user_id
doctor_id
date_id
time_start_id <= time slot for appointment start
time_end_id <= time slot for appointment end

我在这里看不到对doctor_slots表的单独需求。如果你想跟踪开放的医生插槽,你也可以在这个表中通过让user_id简单地= NULL直到插槽被填满来实现。

这将允许您在user_id和date_id上​​强制执行唯一索引。