【发布时间】:2011-08-24 10:45:35
【问题描述】:
假设我有一个包含整数列 Col1、Col2、Col3、Col4 的表。每列都可以为空,并且有效行必须包含恰好 1 列中的值(即所有空值都无效,多于 1 列也无效)。
目前我有这样的检查约束
ALTER TABLE [dbo].[MyTable] WITH CHECK
ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK
((
[Col1] IS NOT NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NOT NULL AND [Col3] IS NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NOT NULL AND [Col4] IS NULL
OR
[Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NOT NULL
));
GO;
它有效,但令我震惊的是,可能有一种更优雅的方式来实现相同的结果(例如,this questioner 想要检查至少 1 个字段不为空,而 COALESCE 关键字在这种情况下效果很好)。
【问题讨论】:
-
对我来说,你的约束比接受的答案更清楚。无论哪种方式,我都觉得有一点设计问题的味道:也许是表格没有完全标准化?也许真实的列名会提供更多线索(希望那些不是真实的名字!)
标签: sql sql-server check-constraints