2014-03-19 34 views
0

值我有以下兩個表:CHECK約束不允許超過從外鍵

CREATE TABLE test1 
(
    ID int IDENTITY UNIQUE, 
    length int not null 
) 

CREATE TABLE test2 
(
    ID int IDENTITY UNIQUE, 
    test1number int references test1(ID), 
    distance int not null 
) 

實施例:允許插入TEST1值1和100(ID = 1和長度= 100)。現在讓我們插入test2的值1作爲ID,test1number = 1作爲test1的參考。我想創建一個不允許寫入距離大於100(從test1開始的長度)的約束。

除了程序以外的其他方法?

+0

是啊SQL服務器:) – user3162968

+0

如果在'test1'中引用單行的*多*行,是約束「沒有行可能有'距離'大於'長度'」,或者是「總和「距離」值可能不會超過「長度」? –

+0

第一:))距離不能更大 – user3162968

回答

1

如果這是個別行,我們並不需要斷言所有行的一些屬性與同test1number值,那麼一個辦法做到這一點是這樣的:

CREATE TABLE test1 
(
    ID int IDENTITY UNIQUE, 
    length int not null, 
    constraint UQ_test1_Length_XRef UNIQUE (ID,Length) 
) 
go 
CREATE TABLE _test2 
(
    ID int IDENTITY UNIQUE, 
    test1number int references test1(ID), 
    _test1length int not null, 
    distance int not null, 
    constraint FK_test2_test1_length_xref foreign key (test1number,_test1length) 
      references test1 (ID,length) on update cascade, 
    constraint CK_length_distance CHECK (distance <= _test1length) 
) 
go 
create view test2 
as 
    select ID,test1number,distance from _test2 
go 
create trigger T_I_t2 on test2 
instead of insert 
as 
    insert into _test2(test1number,_test1length,distance) 
    select test1number,length,distance 
    from inserted i inner join test1 t on i.test1number = t.id 
go 

我們只需要查看如果您試圖隱藏用戶的_test2表中這一額外列的存在,則會觸發。

+0

很好的答案,謝謝。 test1length之前的含義是什麼?我也嘗試谷歌 – user3162968

+1

@ user3162968 - 它沒有什麼特別的意義。我傾向於使用'_'作爲任何表/列/等的前綴,我不打算向用戶公開。所以上面代碼的意圖是這個數據庫的用戶仍然只能訪問'test1(ID,length)'和'test2(ID,test1number,distance)'並且不知道'_test1'表,也沒有' _test1length'列。 –