gpt4 book ai didi

c# - 高级级联删除

转载 作者:行者123 更新时间:2023-12-01 22:16:09 26 4
gpt4 key购买 nike

我有一个非常简单的数据库,其架构定义如下:

CREATE TABLE dbo.Tags
(
TagName NVARCHAR(100) PRIMARY KEY
);

CREATE TABLE dbo.Posts
(
PostSlug NVARCHAR(100) PRIMARY KEY,
Title NVARCHAR(100) NOT NULL
);

CREATE TABLE dbo.PostTagJunction
(
PostSlug NVARCHAR(100),
TagName NVARCHAR(100)
PRIMARY KEY (PostSlug, TagName),
FOREIGN KEY (PostSlug) REFERENCES dbo.Posts (PostSlug)
ON DELETE CASCADE,
FOREIGN KEY (TagName) REFERENCES dbo.Tags (TagName)
);

我想做到这一点,以便当我从 dbo.Posts 中删除帖子时,dbo.Tags 中生成的非引用标签也会被删除。

考虑以下代码:

INSERT INTO dbo.Posts
VALUES ('hello-world', 'Hello World');
INSERT INTO dbo.Tags
VALUES ('Introduction');
INSERT INTO dbo.PostTagJunction
VALUES ('hello-world', 'Introduction');
DELETE
FROM dbo.Posts
WHERE postslug = 'hello-world'

因为我使用级联删除选项,所以帖子会从 dbo.Posts 中删除,记录也会从 dbo.PostTagJunction 中删除。然而,尽管是孤儿,dbo.Tags 中的 hello-world 记录仍然存在。我也想删除标签。如何?

我应该强调,如果该标签正在被其他帖子使用,则不应将其删除。谢谢。

我使用 DapperC# 与数据库通信。

最佳答案

您可以使用触发器对数据库进行非规范化,换句话说,您可以在 dbo.Posts 上创建一个 FOR DELETE 触发器,该触发器将自动删除孤儿中的记录dbo.Tags 表,示例:

CREATE TRIGGER triggerName
ON dbo.Posts
FOR DELETE
AS
DELETE FROM dbo.Tags
WHERE TagName IN (SELECT TagName FROM DELETED)
GO

关于c# - 高级级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28668768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com