我有以下表格定义:
CREATE TABLE X (
A SOMETYPE NOT NULL,
B SOMETYPE NOT NULL,
C SOMETYPE NULL,
PRIMARY KEY (A,B),
FOREIGN KEY (A) REFERENCES Y (A)
);
我想添加以下约束:如果C IS NOT NULL
,则FOREIGN KEY (A,C) REFERENCES X (A,B)
。我该怎么做(如果可能的话,不使用触发器)?
我使用的是SQL Server 2008 R2,但这与问题无关。
答案 0 :(得分:1)
如果我得到了你想要的东西,你需要在表Y中的A上有一个主键,在表Y中有A,B的唯一约束。
试试这个:
create table Y
(
A int not null,
B int not null,
primary key (A)
);
create unique index IX_Y_AB on Y(A, B);
create table X
(
A int not null,
B int not null,
C int null,
primary key (A, B),
foreign key (A) references Y(A),
foreign key (A, C) references Y(A, B)
);
测试:
insert into Y values (1, 2)
insert into X values (1, 1, null) -- OK
insert into X values (1, 2, 2) -- OK
insert into X values (1, 3, 3) -- Fail
答案 1 :(得分:1)
我怀疑你是在过度思考:
CREATE TABLE X (
A SOMETYPE NOT NULL,
B SOMETYPE NOT NULL,
C SOMETYPE NULL,
PRIMARY KEY (A,B),
FOREIGN KEY (A) REFERENCES Y (A),
FOREIGN KEY (A,C) REFERENCES X(A,B)
);
如果引用列(例如C
)为空,则不会检查外键。因此,如果C
为null,则不检查第二个外键。但如果C
不为空,那么A,C
必须与同一个表中的A,B
组合相匹配。