[英]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.