2013-05-15 29 views
1

我有以下tFather和年擄錶行:SQL:奇怪的行爲,刪除子表上最後一行相關刪除對父親表

IF OBJECT_ID('dbo.tChild', 'U') IS NOT NULL 
    DROP TABLE dbo.tChild 

IF OBJECT_ID('dbo.tFather', 'U') IS NOT NULL 
    DROP TABLE dbo.tFather 


CREATE TABLE [dbo].[tFather](
    [ID] [bigint] NOT NULL, 
    [fld1] [varchar](50) NULL, 
CONSTRAINT [PK_tFather] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[tChild](
    [ID] [bigint] IDENTITY(1,1) NOT NULL, 
    [tFather_ID] [bigint] NULL, 
    [fld1] [nvarchar](50) NULL, 
CONSTRAINT [PK_tChild] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[tChild] WITH CHECK ADD CONSTRAINT [FK_tChild_tFather] FOREIGN KEY([tFather_ID]) 
REFERENCES [dbo].[tFather] ([ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[tChild] CHECK CONSTRAINT [FK_tChild_tFather] 
GO 


INSERT INTO dbo.tFather (ID, fld1) VALUES ('1', 'a') 

INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'X') 
INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'Y') 
INSERT INTO dbo.tChild (tFather_ID, fld1) VALUES ('1', 'Z') 

SELECT * FROM dbo.tFather 

ID | fld1 
--------- 
1 | a 

SELECT * FROM dbo.tChild 

ID | tFather_ID | fld1 
---------------------- 
1 |   1 | X 
2 |   1 | Y 
3 |   1 | Z 

越遠越好! 現在,當我從tFather刪除一行,所有行都正常從刪除tChild因爲級聯刪除/更新

問題是,當我從tChild刪除行一切正常,直到我刪除最後一行,然後tFather中的行也被刪除,這很奇怪。

我在同一個數據庫中的許多相關表和它們的行爲正常,(沒有記錄在tFather刪除時記錄年擄被刪除(表名是象徵性的,所以你可以理解的關係型))

讓測試行爲:

DELETE FROM dbo.tChild WHERE ID='3' 

SELECT * FROM dbo.tFather 

ID | fld1 
--------- 
1 | a 

SELECT * FROM dbo.tChild 

ID | tFather_ID | fld1 
---------------------- 
1 |   1 | X 
2 |   1 | Y 


DELETE FROM dbo.tChild WHERE ID='2' 

SELECT * FROM dbo.tFather 

ID | fld1 
--------- 
1 | a 

SELECT * FROM dbo.tChild 

ID | tFather_ID | fld1 
---------------------- 
1 |   1 | X 


DELETE FROM dbo.tChild WHERE ID='1' 

SELECT * FROM dbo.tFather 

ID | fld1 
--------- 
      << - HERE IS THE PROBLEM !!! NO ROWS !!!!! 

SELECT * FROM dbo.tChild 

ID | tFather_ID | fld1 
---------------------- 

什麼可能導致此類行爲?

任何建議將是巨大的

謝謝

+0

在SQL 2008 R2上嘗試了您的代碼,它的行爲完美無缺。來自父表的數據沒有被刪除 – Raj

+4

我猜想你沒有向我們展示過的觸發器。 –

+0

@Damien_The_Unbeliever:這些桌子上沒有觸發器!觸發器是我想到的第一件事。 – armen

回答

0

我懷疑問題是與ON UPDATE CASCADE和ON DELETE CASCADE。然而,你提交的代碼工作正常,並且級聯的工作原理應該是,即如果你刪除父親,它的所有孩子都會被刪除。