2012-03-01 133 views

回答

7

你可以用一个台级CHECK constraint实现这个:

ALTER TABLE YourTable 
ADD CONSTRAINT CK_YourCheck 
CHECK(ColumnA IS NOT NULL OR ColumnB NOT IN (12, 13, 14)) 
+1

已经upvoted,但可能值得添加基于特定问题的示例代码。 – 2012-03-01 19:37:42

+0

@Damien_The_Unbeliever好的建议,加... – 2012-03-01 19:42:30

+0

奇怪...当我尝试这个我得到的错误ALTER TABLE语句与CHECK约束CK_YourCheck冲突...语句如何与不存在的约束冲突。而且如果你想知道,我没有仔细检查数据,现在不违反约束条件。 – keithwarren7 2012-03-01 19:52:21

1

是的,你可以这样做使用Check Constraint

像这样的事情?

ADD CONSTRAINT check validCHECK ( 
     ((B BETWEEN 12 and 14) AND A IS NOT NULL) 
     OR B NOT BETWEEN 12 and 14 
    ); 
0

在一阶逻辑,这是被称为含义:

IF x THEN y 

运用implcation法,上述可转化为这样:

(NOT (x)) OR y 

代您的表达式:

IF column B is equal to 12,13 or 14 THEN A cannot be null 

运用implcation法:

(NOT (column B is equal to 12,13 or 14)) OR A cannot be null 

代SQL表达式:

(NOT (B IN (12, 13, 14))) OR (NOT (A IS NULL)) 

应用德摩根定律:

(NOT x) OR (NOT y) is equivlent to NOT (x AND y) 

因此:

NOT (B IN (12, 13, 14) AND A IS NULL) 

SQL DDL:

ALTER TABLE YourTable ADD 
    CONSTRAINT your_rule 
     CHECK (NOT (B IN (12, 13, 14) AND A IS NULL)); 
+0

任何人都知道为什么这一个downvoted? – onedaywhen 2012-03-05 16:13:27

相关问题