创建 mySQL 工作台数据库设计中数据字段的异或

问题描述 投票:0回答:1

我的数据库设计中有一个“分配”表,它有很多字段,但我有一个问题是有 2 个不同的字段。作业只能由 student1 或 student2 提交,student1 和 student2 有两个不同的表,不能合并。

是否可以对 student1 和 student2 强制执行 XOR 的概念,以便只有一个人可以提交作业?或者我可以说这取决于数据库应用程序来“执行”这个

我尝试过使用 NN,但如果我将两个字段都设置为 NN,则会出现可靠性问题,因为用户可以为两个字段都输入 null。

mysql sql database-design xor
1个回答
0
投票

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

DBfiddle

© www.soinside.com 2019 - 2024. All rights reserved.