我想限制一个列,当另一列有值时,它只能有一个值。
示例:(这不起作用)
create table testConstraint (
col1 int not null identity(1, 1) primary key,
col2 int,
col3 int check (col2 is not null),
col4 int)
这是不可能的,因为他无法引用另一列。 错误:
列'col3'的列CHECK约束引用另一列, table'testConstraint'。
另一个尝试是:(也不起作用)
create table testConstraint (
col1 int not null identity(1, 1) primary key,
col2 int,
col3 int,
col4 int)
GO
alter table testConstraint add constraint ck_columnNotNull check (case when col2 is null then col3 is null end)
GO
任何人都知道如何使用约束来实现这一目标?
答案 0 :(得分:2)
你可以写一个触发器。
另外,你可以试试这个
(1)
ALTER TABLE TestConstraint ADD CONSTRAINT
CK_TestConstraint CHECK (NOT ( (col3 is not null) and (col2 is null) ))
GO
或者
(2)
ALTER TABLE TestConstraint ADD CONSTRAINT
CK_TestConstraint CHECK
(
((col3 is not null) and (col2 is not null)) or
((col3 is null) and (col2 is null))
)
GO
取决于你究竟需要什么。
我刚试过它,它确实可行。我想。
insert into
TestConstraint
(col2, col3, col4)
values
(null, 1, 2)
-- ERROR
insert into
TestConstraint
(col2, col3, col4)
values
(1, 1, 2)
-- OK
答案 1 :(得分:0)
ALTER TABLE testConstraint
ADD CONSTRAINT ck_columnNotNull
CHECK ( 1 = CASE
WHEN col2 IS NULL AND col3 IS NULL THEN 1
WHEN col2 IS NOT NULL AND col3 IS NOT NULL THEN 1
ELSE 0
END)
答案 2 :(得分:0)
只需要简单的逻辑,并且需要(根据您的第二次尝试)成为表检查约束,因此您不能使用col3
的声明内联声明它:
create table testConstraint (
col1 int not null identity(1, 1) primary key,
col2 int,
col3 int,
col4 int)
GO
alter table testConstraint add constraint ck_columnNotNull check (
col3 is null
or col2 is not null
)
GO
如果col3
为null
,那么我们不关心 col2
的值是什么。相反,如果它不 NULL
,那么我们确实希望强制执行col2
不 null。这就是or
的双方有效地给了我们的东西。