几个月前,我写了一些问题,以便记录内容。 您可以向任务添加消息,任务完成,消息全部保留,这很好,因此不完整或完成的任务将消息与消息表中的task_id相关联。问题是,如果有人删除任务,它不会删除通过它的ID附加到它的消息。
所以我现在有很多没有“所有者”的消息,只是在数据库中说谎多余,所以我需要以某种方式从job.id中不存在messages.task_id的消息中删除所有消息。 。希望我的伪代码解释我需要做的事情。
感谢。
答案 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 KEYS
和ON 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