我的数据库设计中有一个“分配”表,它有很多字段,但我有一个问题是有 2 个不同的字段。作业只能由 student1 或 student2 提交,student1 和 student2 有两个不同的表,不能合并。
是否可以对 student1 和 student2 强制执行 XOR 的概念,以便只有一个人可以提交作业?或者我可以说这取决于数据库应用程序来“执行”这个
我尝试过使用 NN,但如果我将两个字段都设置为 NN,则会出现可靠性问题,因为用户可以为两个字段都输入 null。
CHECK 约束可能有帮助,例如(MySQL v8)
桌子
create table test(
student1 varchar( 100 )
, student2 varchar( 100 )
, constraint xor_check check (
student1 is null and student2 is not null
or
student1 is not null and student2 is null
or
student1 is null and student2 is null
)
) ;
测试
-- must fail
insert into test( student1, student2 ) values ( 's1', 's2' ) ;
-- message:
-- Check constraint 'xor_check' is violated.
-- must succeed
insert into test( student1, student2 )
values
( 's1', null )
, ( null, 's2' )
, ( null, null )
;
-- message:
-- Records: 3 Duplicates: 0 Warnings: 0
查询
select * from test ;
-- result
student1 student2
s1 null
null s2
null null