2010-10-28 77 views
1
CREATE Table A 
(
AId int , 
AName varchar(100) 
) 

CREATE Table B 
(
BId int, 
AId int, 
CId int, 
BName varchar(100) 
) 

CREATE Table C 
(
CId int, 
CName varchar (100) 

) 

「A」在「B」和「C」也有B.外國鍵外鍵都級聯刪除外鍵。SQL Server 2005中 - 級聯刪除所有相關表

外鍵: -

/****** Object: ForeignKey [FK_B_A] Script Date: 10/28/2010 17:20:16 ******/ 
ALTER TABLE [dbo].[B] WITH CHECK ADD CONSTRAINT [FK_B_A] FOREIGN KEY([AId]) 
REFERENCES [dbo].[A] ([AId]) 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[B] CHECK CONSTRAINT [FK_B_A] 
GO 
/****** Object: ForeignKey [FK_B_C] Script Date: 10/28/2010 17:20:16 ******/ 
ALTER TABLE [dbo].[B] WITH CHECK ADD CONSTRAINT [FK_B_C] FOREIGN KEY([CId]) 
REFERENCES [dbo].[C] ([CId]) 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[B] CHECK CONSTRAINT [FK_B_C] 
GO 

- 採樣數據

INSERT INTO A 
VALUES (1, 'Ashish') 
INSERT INTO A 
VALUES (2, 'Sanjay') 
INSERT INTO A 
VALUES (3, 'Vivek') 

INSERT INTO B 
VALUES 
(1,1,10,'Ashish1') 
INSERT INTO B 
VALUES 
(2,1,11,'Ashish2') 
INSERT INTO B 
VALUES 
(3,1,12,'Ashish3') 


INSERT INTO B 
VALUES 
(4,2,13,'Ashish1') 
INSERT INTO B 
VALUES 
(5,2,14,'Sanjay') 
INSERT INTO B 
VALUES 
(6,3,15,'Vivek') 

INSERT INTO C 
VALUES 
(10, 'Ashish Data1') 
INSERT INTO C 
VALUES 
(11, 'Ashish Data2') 

INSERT INTO C 
VALUES 
(12, 'Ashish Data3') 

INSERT INTO C 
VALUES 
(13, 'Ashish Data4') 

INSERT INTO C 
VALUES 
(14, 'sanjay Data1') 

INSERT INTO C 
VALUES 
(15, 'Vivek Data1') 

我以爲下面將從所有表中刪除所有數據: -

DELETE a FROM A a 
INNER JOIN B ON A.AId = B.AId 
INNER JOIN C ON B.CId = C.CID 

,而不是我不得不寫這個: -

DELETE a FROM A a 
INNER JOIN B ON A.AId = B.AId 

DELETE b FROM B b 
INNER JOIN C ON B.CId = C.CID 

有什麼辦法刪除單個刪除語句中的所有數據嗎?

+0

請發表您的'FOREGIN KEYs' – Quassnoi 2010-10-28 11:31:32

+0

@Quassnoi的定義,定義發佈的外鍵。 – 2010-10-28 17:29:12

回答

0

您不能使用單個語句從AC中刪除記錄,因爲這些表格不處於傳遞引用關係。

如果你想從ACB有相應的記錄刪除所有的記錄,你應該使用兩個語句:

DELETE a 
FROM a 
JOIN b 
ON  b.aid = a.aid 

DELETE c 
FROM c 
JOIN b 
ON  b.cid = c.cid 
+0

我不認爲需要連接。外鍵約束將確保B中的數據與A中的數據相關聯。那麼只有當您想刪除A和B中除B中未引用的A中的行以外的所有記錄時才需要連接。 – pavanred 2010-10-29 03:29:37

+0

@ Pavan:正如我所說的,這個查詢刪除了「A'和'C'中所有記錄都在'B'中的相應記錄」 – Quassnoi 2010-10-29 06:23:39

1

基本上,如果我理解正確,只能刪除'b'中的數據,它會刪除'a'和'c'中的數據。

甲< - B [刪除] - 「ç

Microsoft website

ON DELETE CASCADE

指定如果試圖刪除行與鍵由其他表中的現有行中的外鍵引用,則包含這些外鍵的所有行也將被刪除。如果在目標表上還定義了級聯參考操作,則還會爲從這些表中刪除的行採用指定的級聯操作。

+0

不,從C中刪除數據並不會刪除A和B中的數據。 – 2010-10-28 11:24:44

+1

一直試圖讓我的頭腦發熱,但我認爲你已經回答了這個問題,但這是因爲FK是A-> B <-C - 或者類似的東西,這會阻止級聯一路下降。 – 2010-10-28 11:25:06

+0

以下不起作用: - DELETE C FROM C c INNER JOIN B ON C.CId = B.CId INNER JOIN A ON A.AId = B.Id – 2010-10-28 11:27:22

1

級聯刪除意味着在父表上執行刪除操作時,子表中引用父表的相應行也會被刪除。

所以你的情況表B是兩個表A和表C.

所以,你不能有一個delete語句從所有表中刪除數據的子表。相反,你可以從表A中刪除一行,它會刪除表B對應的子行

同樣,從表下的刪除將從表B.刪除其相應的子行

編輯 - 的你寫的查詢是刪除沒有where子句。所以,如果你想刪除所有從表A和表C中的行,有通過刪除表B中引用的所有行,你可以使用這個 -

DELETE FROM A --deletes all rows in A and corresponding referenced rows in B 

DELETE FROM C --deletes all rows in C and corresponding referenced rows in B 
+0

是的,沒錯。就像我在我的問題中已經刪除的聲明一樣。 – 2010-10-28 13:21:59

+0

添加刪除語句到我的答案 – pavanred 2010-10-28 14:09:15

0

嗯,是有可能改變的約束?

問題是因爲我看到C有一個1到多個A,而B有一個1到多個C,所以不是AId是B中的外鍵,而是AId是外鍵C, 所以如果你從A中刪除一個人,它會級聯到C,這將級聯到B. 如果您從C中刪除項目,它將級聯到B,但不是A,並且如果您從B中刪除項目,則它不會影響其他兩個表中的任何一個。

我的建議:

CREATE TABLE [A] (
    [AId] [int] NOT NULL , 
    [AName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
    CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
    (
     [AId] 
    ) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [C] (
    [CId] [int] NOT NULL , 
    [CName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
    [AId] [int] NULL , 
    CONSTRAINT [PK_C] PRIMARY KEY CLUSTERED 
    (
     [CId] 
    ) ON [PRIMARY] , 
    CONSTRAINT [FK_C_A] FOREIGN KEY 
    (
     [AId] 
    ) REFERENCES [A] (
     [AId] 
    ) ON DELETE CASCADE 
) ON [PRIMARY] 
GO 

CREATE TABLE [B] (
    [BId] [int] NOT NULL , 
    [AId] [int] NULL , 
    [CId] [int] NULL , 
    [BName] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
    CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED 
    (
     [BId] 
    ) ON [PRIMARY] , 
    CONSTRAINT [FK_B_C] FOREIGN KEY 
    (
     [CId] 
    ) REFERENCES [C] (
     [CId] 
    ) ON DELETE CASCADE NOT FOR REPLICATION 
) ON [PRIMARY] 
GO 

採用這種設置,Delete From A將清理掉所有3個表中一氣呵成。

編輯:你可以保留AId在B中使連接更容易,但它不會與刪除級聯有任何關係。