2009-12-02 82 views
10

与同事开玩笑,我想出了一个有趣的场景:是否有可能在SQL Server中定义一个表,以便通过“标准方法”(约束等)我可以确保两列或更多列是互斥的?SQL-Server:将列定义为互斥

我的意思是:我可以确保只有一列包含一个值吗?

+0

你试图解决什么问题?低于正常水平的数据库是PITA可以使用的,也许你可以通过不牺牲关系好处的方式来实现。 – 2009-12-02 10:44:45

+0

那么,这个想法背后并没有一个实际的问题。我只是想知道在技术上做到这一点是否可行。一个想法可能是要求用户输入自己的名字或公司名称,但不能同时输入。我猜想我可能想出更好的东西:-) – 2009-12-02 10:50:19

回答

14

是的,你可以使用CHECK约束:

ALTER TABLE YourTable 
ADD CONSTRAINT ConstraintName CHECK (col1 is null or col2 is null) 

根据您的意见,如果许多列是排他的,你可以检查他们是这样的:

case when col1 is null then 0 else 1 end + 
case when col2 is null then 0 else 1 end + 
case when col3 is null then 0 else 1 end + 
case when col4 is null then 0 else 1 end 
= 1 

这是说的一个四列必须包含一个值。如果它们都可以是NULL,只需检查<= 1

+0

啊,是的,我可以看到这是怎么回事。但是,如果我有三列或更多列,则检查会复杂得多,因为我必须添加所有可能的组合,对吗? – 2009-12-02 10:51:03

+0

@Thorsten迪特马:它得到一个稍微复杂与多列,我觉得你能做到不增加每一个可能的组合,答案编辑 – Andomar 2009-12-02 11:24:26

+0

嗨要求与上述完全一样的状况相一致,但另外我想col1和col2上都应该不会在同一时间为空,只有他们中的任何一个必须总是被填充。如何确保? – MaxRecursion 2012-12-22 12:52:02