有没有办法让列的可空性取决于另一列的可空性?

ral*_*oss 11 sql ms-access nullable

我在数据库表中有两列(以及其他列):ExitDate和ExitReason.我们的业务逻辑要求在指定ExitDate时指定ExitReason.ExitDate列需要允许空值,因为在插入时并不总是知道该值.有没有办法让ExitReason列仅在ExitDate值为null时才允许空值?我可以通过将这两列分成单独的"退出日期"表并使它们都不可为空来完成效果,但如果我不必这样做会很好.

想法?谢谢!

Nic*_*mas 13

假设您使用的是SQL Server或类似的东西,可以在表上使用CHECK约束来执行此操作.(不幸的是,MySQL 解析但忽略了 CHECK约束,所以你必须使用该平台的触发器.)

如果表已存在:

ALTER TABLE ADD CONSTRAINT CK_ExitDateReason
CHECK (
      (ExitDate IS NULL AND ExitReason IS NULL) 
   OR (ExitDate IS NOT NULL AND ExitReason IS NOT NULL) 
);
Run Code Online (Sandbox Code Playgroud)

如果您自己创建表:

CREATE TABLE dbo.Exit (
     ...

   , CONSTRAINT CK_ExitDateReason CHECK ...
);
Run Code Online (Sandbox Code Playgroud)

使用检查约束比使用触发器更可取,因为:

  • 检查约束比触发器更明显
  • 约束是表定义的一部分,而不是单独运行的代码,因此它在逻辑上更清晰
  • 我愿意打赌它比触发器更快

  • 如果使用的平台允许比较布尔表达式的结果,那么检查表达式可以像`(ExitDate IS NULL)=(ExitReason IS NULL)`一样简单. (4认同)
  • +1对于"如此年轻的人"(无论如何,在声誉方面)这么好的答案.保持良好的工作 :) (2认同)