Tob*_*oby 9 sql sql-server check-constraints
我有一个包含4列的表(ID(PK,int,NOT NULL),col1(NULL),col2(NULL),col3(NULL))
我想添加一个CHECK约束(我认为表级别?),以便:
if col1 OR col2 are NOT NULL then col3 must be NULL
Run Code Online (Sandbox Code Playgroud)
如果col3为NOT NULL,则col1 AND col2必须为NULL
即如果col1和col2不为null,则col3应为null,反之亦然
我是SQL和SQL服务器的新手,但我不确定如何实际实现它,即使它可以/应该实现?
我想也许:
CHECK ( (col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR
(col3 NOT NULL AND col1 NULL AND col2 NULL) )
Run Code Online (Sandbox Code Playgroud)
但我不确定是否可以使用括号将这样的逻辑分组?
如果没有,如何最好地实施?
Pin*_*nyM 11
当然,你可以做到这一点.看到这个sqlfiddle.
但是,您需要确保正确地组合逻辑.你应该从来没有在同一个包围范围混用AND和OR.所以:
(col1 NOT NULL OR col2 NOT NULL AND col3 NULL)
Run Code Online (Sandbox Code Playgroud)
需要成为:
((col1 NOT NULL OR col2 NOT NULL) AND col3 NULL)
Run Code Online (Sandbox Code Playgroud)
要么:
(col1 NOT NULL OR (col2 NOT NULL AND col3 NULL))
Run Code Online (Sandbox Code Playgroud)
取决于你的意图.
只是要小心不要用括号出错。
CREATE TABLE Test1 (col1 INT, col2 INT, col3 INT);
ALTER TABLE Test1
ADD CONSTRAINT CHK1
CHECK (((col1 IS NOT NULL OR col2 IS NOT NULL) AND col3 IS NULL) OR
((col1 IS NULL AND col2 IS NULL) AND col3 IS NOT NULL))
INSERT INTO Test1 VALUES (1,1,1); --fail
INSERT INTO Test1 VALUES (1,1,NULL); --good
INSERT INTO Test1 VALUES (1,NULL,NULL); --good
INSERT INTO Test1 VALUES (1,NULL,1); --fail
INSERT INTO Test1 VALUES (NULL,NULL,1); --good
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17078 次 |
| 最近记录: |