mysql - 如何保证表中两个可为空的列之间只存在一个值
问题描述
user
有两个 FK,一个 tostudent
和第二个 to teacher
,都可以为空。
create table user(
employeeId int null,
teacherId int null
foreign key (employeeId) references employee (id),
foreign key (teacherId) references teacher (id)
);
我需要什么时候employeeId
为空,teacherId
必须存在,当employeeId
存在时,teacherId
必须为空。
永远不要两者都为 null 或两者都存在。在创建表期间有什么方法可以保证这种行为?
类表继承不适合我的情况。
解决方案
您可以使用 CHECK (MySQL 8.0.16+):
create table user(
employeeId int null,
teacherId int null,
foreign key (employeeId) references employee (id),
foreign key (teacherId) references teacher (id),
CHECK ((employeeId IS NULL) + (teacherId IS NULL) = 1)
);
CREATE TABLE employee(id INT PRIMARY KEY);
INSERT INTO employee VALUES(1);
CREATE TABLE teacher(id INT PRIMARY KEY);
INSERT INTO teacher VALUES(1);
create table user(
employeeId int null,
teacherId int null,
foreign key (employeeId) references employee (id),
foreign key (teacherId) references teacher (id),
CHECK ((employeeId IS NULL) + (teacherId IS NULL) = 1)
);
INSERT INTO user VALUES(NULL,NULL);
-- Check constraint 'user_chk_1' is violated.
INSERT INTO user VALUES(1,1);
-- Check constraint 'user_chk_1' is violated.
INSERT INTO user VALUES(1,NULL);
INSERT INTO user VALUES(NULL,1);
SELECT * FROM user;
推荐阅读
- unsigned - “0xDEADBEEF” - 有符号还是无符号?
- angular - 带有 for 循环的 Angular Promise 函数未按预期工作
- flutter - 颤动在桌面和网络中获取鼠标位置
- arduino - nodemcu esp8266 http请求返回-1“连接失败”
- python - 返回具有动态索引的嵌套字典或嵌套列表的值
- java - 如何使用 docker-java 获取容器的主机名?
- angular - 如何在 Angular 指令中选择具有特定类的元素的子元素?
- python - 从分组的熊猫系列中创建晶须图
- flutter - 有条件地向图像传递参数
- flutter - 无法检查用户帐户是否存在?