2015-02-10 47 views
0

我有有一個主鍵t1id.I具有帶有列t1id另一個表T2是一個forign關鍵T1的t1id table.Please看到查詢表T1級聯約束如何添加對現有列

create table T1 
(
    t1idint primary key IDENTITY(1,1), 

    Name varchar(200) not null 

); 




create table T2 
(
    t2idint primary key IDENTITY(1,1), 

    t1id int, 
    nod bigint, 
    foreign key (t1id) references T1(t1id) 
); 

以及更多與T2表格鏈接的表格,我沒有在這裏展示。

我已經在表T1和T2中插入了一些值。

現在要從T1中刪除一行,我必須先從T2中刪除一行,然後只能由於foriegn密鑰關係從T1中刪除一行。

所以我想加入級聯約束是好主意

我試着像下面

ALTER TABLE T2 
ADD CONSTRAINT fk_T2id 
FOREIGN KEY (t1id) 
REFERENCES T1(t1id) 
ON DELETE CASCADE; 

,但我得到了下面的錯誤

消息1785,級別16,狀態0,第1行 在表'T2'中引入FOREIGN KEY約束'fk_t1id'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 消息1750,級別16,狀態0,行1 無法創建約束。查看以前的錯誤。

+0

您的示例代碼不夠好,無法顯示您觀察到的行爲(在我將其修復爲實際工作後)。編輯它以確保錯誤實際顯示:)此外,通常您只需將'on delete cascade'添加到現有約束,而不是創建一個新的約束。 – Luaan 2015-02-10 09:06:58

回答

1

我發現自己在你的情況多次,但從未使用級聯。我做了一個SP,它會得到我想要刪除的ID,然後在事務中自己刪除。見例如

CREATE PROCEDURE [dbo].[spConfiguration_Table1_Del] 
@ID int 
AS 

Declare @ERR int 
set @ERR = 0 
begin tran 

    DELETE FROM Table1 WHERE ID = @ID 
    set @ERR = @@Error 

    if @ERR = 0 begin 
    DELETE FROM Table2 WHERE ID IN (SELECT ID FROM Table3 WHERE ID = @ID) 
    set @ERR = @@Error 
    end 

    if @ERR = 0 begin 
    DELETE FROM Table3 WHERE ID = @ID 
    set @ERR = @@Error 
    end 

if @ERR = 0 commit tran 
else rollback tran 

這樣,您就可以控制刪除發生的方式,也如果從一個表中刪除錯誤,交易將回滾所有被刪除的行和你保持你的數據是一致的。

+0

感謝您的回答,爲什麼要調用程序,我也可以寫3個不同的問號 – SpringLearner 2015-02-10 09:04:55

+0

確實,但使用SP更方便。如果您只重複多次查詢,您只能傳遞一次您的ID,那麼寫入的代碼行數也會更少。 – CiucaS 2015-02-10 09:08:30

+0

你能告訴我如何使用它?你也可以告訴我,如果它的正確與否http://pastie.org/9934457 – SpringLearner 2015-02-10 09:21:35