我正在使用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表中删除?
答案 0 :(得分:2)
只需将ON DELETE CASCADE
提供给Child Table
(TestQuestion.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触发器。