我有以下专栏
EffectiveDate Date NOT NULL default getDate(),
CONSTRAINT chk_EffectiveDate CHECK (EffectiveDate >= getDate() AND EffectiveDate <= TerminationDate ) ,
TerminationDate Date NOT NULL default '12/31/9999',
CONSTRAINT chk_TerminationDate CHECK (TerminationDate > getDate() AND TerminationDate >= EffectiveDate),
我遇到的问题是,如果我不在那些列中输入值,则会抛出检查约束错误,它不接受默认值
我正在努力实现的目标是可能的吗?
最佳答案
这里真正的问题是您要将日期时间插入日期列,然后检查日期列 >= datetime。因此,如果您现在插入一行,则您正在检查:
2014-02-01 >= 2014-02-01 18:57
除非在极少数情况下您可能恰好在午夜插入一行,否则这永远不会成立。我想你想要的是:
EffectiveDate DATE NOT NULL DEFAULT GETDATE(),
CONSTRAINT chk_EffectiveDate CHECK
(EffectiveDate >= CONVERT(DATE, GETDATE())
AND EffectiveDate <= TerminationDate),
TerminationDate DATE NOT NULL DEFAULT '99991231',
CONSTRAINT chk_TerminationDate CHECK
(TerminationDate > CONVERT(DATE, GETDATE())
AND TerminationDate >= EffectiveDate),
这里仍然存在一些冲突,因为约束的一部分暗示生效日期和终止日期可能是同一天,但约束的另一部分阻止了它。正如 Andriy 在他的评论中所说,这可以简化为单个约束。假设您不想让生效日期和终止日期实际落在同一天,这可以通过一个双列约束来实现:
EffectiveDate DATE NOT NULL DEFAULT GETDATE(),
TerminationDate DATE NOT NULL DEFAULT '99991231',
CONSTRAINT chk_Dates CHECK
(EffectiveDate >= CONVERT(DATE, GETDATE())
AND TerminationDate > EffectiveDate)
尽管正如我在上面的评论中提到的那样,我认为像 12/31/9999 这样的标记值是愚蠢的,不是 NULL 的合适替代品。你还应该 be very careful about using regional, ambiguous formats like mm/dd/yyyy
.
关于sql-server-2012 - SQL 服务器 2012 : Check Constraint with Default Values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503189/