如何从不同的MySQL表中删除所有相关记录

6
我在数据库中有两个表:'stories' 和 'votes'。
stories表包含文章的所有信息(例如标题、正文、作者姓名等)。votes表包含所有文章的投票。在votes中有一个字段叫做item_name,其中包含对一篇文章进行投票的id
简单来说,votes中的item_name等于stories中的id(取决于用户投票的文章)。
问题是:如果一篇文章被删除了,如何自动删除与该文章相关的votes表中的所有记录?
是否可以在数据库本身中设置它,以便无需设置其他PHP查询?
以下是我的数据库结构:

如果您设置了FK关系,请查看ON DELETE CASCADE。如果您没有设置FK关系,则需要手动删除投票数据。 - Aaron McIver
2个回答

6
MySQL有不同的存储引擎,大多数MySQL管理IDE的默认存储引擎是MyISAM。如果您在表中使用此存储引擎,则无法创建列之间的任何关系,并且您必须自己删除相关列。
对于您想要的功能,innoDB是最好的解决方案。这种类型的存储引擎可以创建不同表之间的列之间的关系。您需要在表中定义主键和外键,并在创建这些关系后,必须为它们指定以下特性:

ON UPDATE CASCADEON DELETE CASCADE

这样,在删除主记录后,您就不需要删除相关列值了。
请参阅此链接以比较它们在基准测试中的性能。

此外,您需要创建它们之间的关系,否则仅将它们设置为InnoDB是无法实现您的目标的。 - Mohammad Saberi
好的,我已将它们都设置为InnoDB,并尝试设置关系。我无法弄清楚在哪里放置ON UPDATE CASCADE和ON DELETE CASCADE。 我是否应该在投票表中为item_name创建外键并在那里进行操作? - Ilja
你的投票表中必须有一个story_id。将其分配为外键并与故事表中的id创建关系。然后继续... - Mohammad Saberi
我认为item_name就是我认为你必须拥有的。最好为您的列使用更合适的名称,这将有助于您在项目中更好地使用它们。 - Mohammad Saberi
如何添加外键?当前我已将 item_name 更改为 story_id,并尝试在 phpMyAdmin 中进行编辑,但我看不到任何关于外键的选项。抱歉,可能是我看错了地方,我对这个还很陌生。 - Ilja
显示剩余2条评论

2
在相关的字段上设置外键,并使用级联删除。也许有人能够给你更详细的答案,但你必须使用支持外键(如InnoDB)的引擎,并且如果你不知道如何手动操作,PHPMyAdmin应该可以帮助你完成其余部分。简单地说,将级联删除设置在一个字段上告诉你的数据库,在你的情况下,当文章(位于另一个表中)被删除时,删除具有该约束的每个记录。请参阅此处以获取更多信息:

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

http://forums.digitalpoint.com/showthread.php?t=488163


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接