簡體   English   中英

MySQL跨表的多個唯一鍵

[英]Mysql Multiple Unique Keys Across Tables

我有一張這樣的桌子:

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))

但是,正如您所知,它們沒有起作用。 您有什么建議嗎?

根據您對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表的ID。 如果要跟蹤打開的醫生插槽,也可以在此表中執行此操作,方法是僅將user_id = NULL填充為空。

這將允許您對user_id和date_id強制執行唯一索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM