首页 > 解决方案 > 如何根据条目对 ON DELETE 有不同的行为?

问题描述

我目前正在处理一个涉及医生、患者和医院的数据库的 sql 任务。每家医院都有一名主任医生,我们需要存储该医生开始担任医院主任的日期。我可以将此信息包含在医生表、医院表或它自己的表中。我需要具备以下功能:

“当你删除一个医生时,如果医生是医院的负责人会导致错误发生,而当你删除一个正在治疗病人的医生时会进行级联删除。”

根据要删除的医生,我应该如何在删除时有不同的行为???

我的第一个想法是这样,但它似乎不起作用:

CREATE TABLE DOCTOR (
 LiscenceNumber CHAR(4) NOT NULL, 
 Firstname VARCHAR(20), 
 Lastname VARCHAR(20), 
 Specialty VARCHAR(30), 
 LiscenceDate DATE, 
 IsHead BOOLEAN, 
 HeadDate DATE, 
 HospitalCode CHAR(3), 
 FOREIGN KEY (HospitalCode) REFERENCES Hospital(Code) 
  ON DELETE CASCADE WHERE IsHead = False
)

有任何想法吗?我非常感谢您的任何帮助。

标签: mysqlsqldatabase

解决方案


当你删除一个医生时,如果医生是医院的负责人会导致错误发生,而当你删除一个正在治疗病人的医生时会进行级联删除。

我会选择以下设计:

  • 创建一个doctors表(可能有一个外键引用他们工作的医院,但这不是最重要的)

  • 创建一个引用表主键的hospitals表;此约束防止删除“主要”医生head_doctor_iddoctors

  • 创建一个patients引用医院和医生的表;表的外键doctors应该有一个on delete子句,当医生被删除时删除病人

示例架构:

create table doctors(
    id int primary key,
    ...
);

create table hospitals(
    id int primary key,
    ...
    head_doctor_id int,
    foreign key(head_doctor_id) references doctors(id)
);

create table patients(
    id int primary key,
    ...
    hospital_id int,
    doctor_id int,
    foreign key(hospital_id) references hospitals(id)
    foreign key(doctor_id) references doctors(id) on delete cascade
)

推荐阅读