如何从数据库中删除其线程不再存在的消息

时间:2011-08-29 17:22:00

标签: mysql

几个月前,我写了一些问题,以便记录内容。 您可以向任务添加消息,任务完成,消息全部保留,这很好,因此不完整或完成的任务将消息与消息表中的task_id相关联。问题是,如果有人删除任务,它不会删除通过它的ID附加到它的消息。

所以我现在有很多没有“所有者”的消息,只是在数据库中说谎多余,所以我需要以某种方式从job.id中不存在messages.task_id的消息中删除所有消息。 。希望我的伪代码解释我需要做的事情。

感谢。

3 个答案:

答案 0 :(得分:3)

首先,备份Messages表。

然后尝试此操作以查看所选消息是否有意删除

Select * from Messages where Task_Id NOT IN (Select Task_Id From Tasks)

如果有,请删除

Delete from Messages where Task_Id NOT IN (Select Task_Id From Tasks)

如果您可以使用外键在任务和消息之间强制实施Refential Integrity,您将来会避免出现“孤立记录”问题。

答案 1 :(得分:1)

Raj在这里现场。您可能还想了解FOREIGN KEYSON DELETE CASCADE,它们旨在防止出现此类问题。请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

手册

答案 2 :(得分:1)

delete from messages m left join job j on (j.id = m.task_id) where j.id is null

另外,请考虑添加外键以强制执行参照完整性,这样您就不会再次使用孤立记录了。

alter table messages add constraint foreign key task_id references job.id on delete cascade