我正在创建一个网站,用户可以发布“帖子”,然后用户可以对这些帖子进行“评论”。我有一个包含3个表的数据库。一个包含用户信息,一个包含发布信息,最后一个包含评论信息。
我想设置规则,以便在删除用户时删除所有帖子和评论,如果用户删除了其中一个帖子,则会删除所有相关评论。但是,这会设置“多个CASCADE路径”。
我一直在寻找解决方案并找到有关触发器的一些信息。它们是最好用的吗?如果我使用它们,我是否必须更改所有由触发器完成的CASCADES?
由于
Clivest
答案 0 :(得分: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)不同。如果你一举删除大量数据,级联删除也可以很快地扼杀你的事务日志。
答案 1 :(得分: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
答案 2 :(得分: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
在这种情况下,您可以完全控制实际发生的事情,级联删除没有意外的惊喜,也不需要使用触发器。