繁体   English   中英

删除级联—需要两个或更多外键

[英]ON DELETE CASCADE — two or more foreign keys required

在我的私人消息传递系统中,我具有下表:

用户,消息,线程,thread_participants

我正在尝试建立一个明智的外键关系。

如果删除给定线程的所有用户,我希望删除该线程。 但是给定线程可能有多个用户。

因此,如果用户1和用户2是thread.id = 6的一部分,并且用户1那里的帐户已删除,我不希望这种删除逐步降级到线程表,直到用户2也删除了他们的帐户。 我可以通过这种方式使SQL工作吗?

我认为ON DELETE CASCADE不能完全满足您的需求。 它将使事情变得更容易,但是,您将必须使用触发器才能完全解决问题。 为用户,线程以及它们之间的映射考虑以下简单的表设置:

CREATE TABLE users (id int, user_name varchar(50))

CREATE TABLE threads (id int, content varchar(max))

CREATE TABLE users_to_threads (
   user_id int, 
   thread_id int,
   CONSTRAINT FK_U FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
   CONSTARINT FK_T FOREIGN KEY (thread_id) REFERENCES threads(id) ON DELETE CASCADE
)

现在,无论何时删除用户,他们的映射也都会改变。 然后使用触发器查看是否需要删除任何线程(我很确定,级联会在AFTER触发触发之前删除触发-如果此解决方案仍无法正常工作,则只需进行一些修改即可):

http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

CREATE TRIGGER user_cleanup AFTER DELETE ON users FOR EACH ROW BEGIN
   DELETE threads WHERE id NOT IN 
      (SELECT DISTINCT thread_id FROM users_to_threads)
END

您可能可以编写一个更有效的查询来做到这一点,但是您已经有了大致的了解。 请注意,您无法聪明地在映射表上放置触发器,然后依靠它被“用户”中的级联删除触发。 MySql不支持此功能,而且看起来他们也不打算很快解决此问题: http ://bugs.mysql.com/bug.php?id=11472不知道MariaDB是否已对此进行了修复,我本人是SQL Server专家。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM