如何设置我的SQL以便删除父项删除子行?

时间:2014-02-05 06:04:47

标签: sql-server sql-server-2012 relationship foreign-key-relationship

我正在使用SQL Server 2012,我有以下DDL:

CREATE TABLE [dbo].[Test] (
    [TestId]       INT            IDENTITY (1, 1) NOT NULL,
    [Title]        NVARCHAR (100) NULL,
    CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([TestId] ASC)
);

CREATE TABLE [dbo].[TestQuestion] (
    [TestId]         INT      NOT NULL,
    [TestQuestionId] INT      NOT NULL,
    [QuestionUId]    CHAR (6) NOT NULL,
    CONSTRAINT [PK_TestQuestion] PRIMARY KEY CLUSTERED ([TestId] ASC, [TestQuestionId] ASC),
    CONSTRAINT [FK_TestQuestionTest] FOREIGN KEY ([TestId]) REFERENCES [dbo].[Test] ([TestId])
);

有没有办法可以实现这一点,以便当我在Test表中删除一行时,所有具有该TestId的行都会从TestQuestion表中删除?

2 个答案:

答案 0 :(得分:2)

只需将ON DELETE CASCADE提供给Child TableTestQuestion.TestId)的外键,这样就会在删除父记录时直接删除子记录。

CREATE TABLE [dbo].[Test] (
        [TestId]       INT            IDENTITY (1, 1) NOT NULL,
        [Title]        NVARCHAR (100) NULL,
        CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([TestId] ASC)
    );

    CREATE TABLE [dbo].[TestQuestion] (
        [TestId]         INT      NOT NULL,
        [TestQuestionId] INT      NOT NULL,
        [QuestionUId]    CHAR (6) NOT NULL,
        CONSTRAINT [PK_TestQuestion] PRIMARY KEY CLUSTERED ([TestId] ASC, [TestQuestionId] ASC),
        CONSTRAINT [FK_TestQuestionTest] FOREIGN KEY ([TestId]) REFERENCES [dbo].[Test] ([TestId]) ON DELETE CASCADE
    );

实际上,您可以选择DELETE(以及UPDATE),例如:

删除

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

更新

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

答案 1 :(得分:0)

正如其他评论员所说,级联外键是最好的方法。但是,如果您需要更复杂的逻辑,则可以使用FOR DELETE触发器。