2

我正在制作一个网站,用户可以在其中发布“帖子”,然后用户可以对这些帖子进行“评论”。我有一个包含 3 个表的数据库。一个包含用户信息,一个包含发布信息,最后一个包含评论信息。

我想设置规则,以便如果用户被删除,他们的所有帖子和评论都会被删除,如果用户删除他们的帖子之一,那么所有相关的评论都会被删除。但是,这会设置“多个 CASCADE 路径”。

我一直在寻找解决方案,并找到了一些关于触发器的信息。它们会是最好的使用方法吗?如果我使用它们,我是否必须更改所有 CASCADE 以由触发器完成?

谢谢

克莱斯特

4

3 回答 3

2

使用声明性引用完整性。

create table foo
(
  id   int         not null primary key ,
  foo  varchar(32) not null ,
)
create table bar
(
  id     int not null primary key ,
  foo_id int     null foreign key references foo ( id ) on delete cascade ,
)

从 foo 中删除一行将删除 bar 中的所有相关行。

不过要小心级联删除——胖手指删除语句会很快造成大量损坏,这与 *nix 中的 rm(1) 不同。如果您一举删除大量数据,级联删除也会很快破坏您的事务日志。

于 2010-10-06T17:02:47.820 回答
0

我认为这可以很容易地设置,不会出现您遇到的错误,也无需使用触发器,如下所示:

1) The foreign key between Users and Posts should be set up to be cascade delete
2) The foreign key between Posts and Comments should be set up to be cascade delete
于 2010-10-06T16:59:51.517 回答
0

另一种选择是创建两个专用的存储过程,根据需要执行这些删除步骤

CREATE PROCEDURE dbo.DeleteUser @UserID VARCHAR(50)
AS BEGIN
   DELETE FROM dbo.Comments
   WHERE Author = @UserID

   DELETE FROM dbo.Posts
   WHERE Author = @UserID

   DELETE FROM dbo.User
   WHERE UserID = @UserID
END

对于第二条规则:

CREATE PROCEDURE dbo.DeletePost @PostID INT
AS BEGIN
   DELETE FROM dbo.Comments
   WHERE PostID = @PostID

   DELETE FROM dbo.Posts
   WHERE ID = @PostID
END

在这种情况下,您可以完全控制真正发生的事情,级联删除不会带来意外的惊喜,也不需要使用触发器。

于 2010-10-06T17:08:42.247 回答