ON DELETE CASCADE - 需要两个或多个外键

时间:2014-02-26 18:39:52

标签: mysql sql

在我的私人消息系统中,我有以下表格:

用户,消息,线程,thread_participants

我正在努力建立合理的外键关系。

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

因此,如果用户1和用户2是thread.id = 6的一部分,并且用户1已将帐户删除,我不希望删除级联到线程表,直到用户2也删除了他们的帐户。我能以这种方式让SQL为我工作吗?

1 个答案:

答案 0 :(得分:0)

我不相信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

你可以写一个更有效的查询来做到这一点,但你得到了一般的想法。请注意,不能变得聪明并在映射表上放置一个触发器,然后依赖它来自'users'的级联删除。 MySql不支持这个,看起来他们不打算很快修复它:http://bugs.mysql.com/bug.php?id=11472不确定MariaDB是否有修复,我自己就是SQL Server人员。