2011-09-23 112 views
4

我有以下表定義:如何實現「有條件的外鍵」限制?

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

因此,有些情況下C將爲空,但A不會? – RQDQ

+0

是的。 A是主鍵的一部分,我不是可空主鍵的粉絲。 WRT C,C大部分時間都是空的。 – pyon

回答

1

如果我得到你想要的,你需要有數據表Y上的一個主鍵,並在表上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

我懷疑你的東西得太多:

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爲空,則不檢查第二個外鍵。但是,如果C不爲空,則A,C必須與該表中的A,B組合匹配。