2014-09-28 52 views
0

我有两个表:当我删除SQL Server中的父行时,如何删除子行?

CREATE TABLE [dbo].[AdminTest] (
    [AdminTestId] INT   IDENTITY (1, 1) NOT NULL, 
    [Title]  NVARCHAR (100) NOT NULL, 
    CONSTRAINT [PK_AdminTest] PRIMARY KEY CLUSTERED ([AdminTestId] ASC) 
); 
GO 
CREATE NONCLUSTERED INDEX [Test_ExamId_IX] 
    ON [dbo].[AdminTest]([ExamId] ASC); 
CREATE TABLE [dbo].[AdminTestQuestion] (
    [AdminTestQuestionId] INT    IDENTITY (1, 1) NOT NULL, 
    [AdminTestId]   INT    NOT NULL, 
    [QuestionUId]   UNIQUEIDENTIFIER NOT NULL, 
    CONSTRAINT [PK_AdminTestQuestion] PRIMARY KEY CLUSTERED ([AdminTestQuestionId] ASC), 
    CONSTRAINT [FK_AdminTestQuestionAdminTestId] FOREIGN KEY ([AdminTestId]) REFERENCES [dbo].[AdminTest] ([AdminTestId]) 
); 
GO 
CREATE NONCLUSTERED INDEX [AdminTestQuestion_AdminTestId_IX] 
    ON [dbo].[AdminTestQuestion]([AdminTestId] ASC); 

是否有某种方式,我可以改变表的定义,这样,当我删除AdminTest一排,然后在AdminTestQuestions该测试中的所有子行被删除?

回答

2

您可以将ON DELETE CASCADE添加到您的外键约束;

CONSTRAINT [FK_AdminTestQuestionAdminTestId] 
    FOREIGN KEY ([AdminTestId]) REFERENCES [dbo].[AdminTest] ([AdminTestId]) 
    ON DELETE CASCADE 

An SQLfiddle to test with

我可能不需要指出,从长远来看,这不一定是个好主意,因为它会对其他用户可能不知道的数据进行隐式更改。谨慎使用。

+0

这会将子表中的删除操作传播给父表,但在父表中删除A记录时会发生什么? – 2014-09-28 14:51:05

+0

@ M.Ali不,它会从父母传播给有约束的孩子。如果父母被删除,孩子也被删除。例如,[this SQLfiddle](http://sqlfiddle.com/#!3/84375/1)显示父子在删除时保留,而答案中的小提琴显示传播父 - >子。 – 2014-09-28 14:52:45