NSS*_*NSS 2 check-constraints sql-server-2012
我有以下专栏
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),
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果我没有在那些列中输入值,它会抛出checkconstraint错误,它不接受默认值
我想要实现的是什么?
这里真正的问题是您将日期时间插入日期列,然后检查日期列> = datetime.因此,如果您现在插入一行,您正在检查:
2014-02-01 >= 2014-02-01 18:57
Run Code Online (Sandbox Code Playgroud)
除非在极少数情况下您可以在午夜插入一行,否则这将永远不会成立.你想要的我认为是:
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),
Run Code Online (Sandbox Code Playgroud)
这里仍然存在一些冲突,因为约束的一部分意味着生效日期和终止日期可能都是同一天,但约束的另一部分阻止它.正如Andriy在他的评论中所说,这可以简化为单一约束.假设您并不打算允许生效日期和终止日期实际落在同一天,这可以通过单个两列约束来实现:
EffectiveDate DATE NOT NULL DEFAULT GETDATE(),
TerminationDate DATE NOT NULL DEFAULT '99991231',
CONSTRAINT chk_Dates CHECK
(EffectiveDate >= CONVERT(DATE, GETDATE())
AND TerminationDate > EffectiveDate)
Run Code Online (Sandbox Code Playgroud)
虽然正如我在上面的评论中提到的,我认为像12/31/9999这样的令牌值是愚蠢的,并且不是NULL的正确替代品.您还应该非常小心使用区域的,模糊的格式,如mm/dd/yyyy.
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |