mysql - 如何根据条目对 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
)
有任何想法吗?我非常感谢您的任何帮助。
解决方案
当你删除一个医生时,如果医生是医院的负责人会导致错误发生,而当你删除一个正在治疗病人的医生时会进行级联删除。
我会选择以下设计:
创建一个
doctors
表(可能有一个外键引用他们工作的医院,但这不是最重要的)创建一个引用表主键的
hospitals
表;此约束防止删除“主要”医生head_doctor_id
doctors
创建一个
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
)
推荐阅读
- kubernetes - 如何从存储在 AWS 系统管理器中的参数中获取 Kubernetes 密钥
- c++ - 如何在 Xcode C++ 项目中启用绝对标头
- android-studio - 硬件设备中的 Android Studio
- javascript - 使用 localStorage 在页面之间传递变量并在链接中传递变量
- java - “类型不匹配:无法从 int 转换为 byte”
- ios - 线程一:使用模拟器后出现 Expertin 错误
- powershell - 如何拆分包含换行符的字符串
- python - 如何在python中跳过“ZeroDivisionError:浮点除以零错误”
- python - 在视线上投射速度 - 已编辑
- javascript - 元素类型无效,使用 Flatlist 时