如果有人能帮我解决这个问题,我会很高兴的。我有一个音乐数据库。有3个表:
album (id, album_name)
album_has_song (album_id, song_id)
song (id, song_name)
我在一张专辑中插入了一首歌(填写了所有3张表),但现在我想找到一种删除某些专辑时删除所有内容的简便方法。
$query1 = mysql_query("DELETE FROM album_has_song WHERE album_id=$albumID");
$query2 = mysql_query("DELETE FROM album WHERE id=$albumID");
$query3 = mysql_query("DELETE FROM song JOIN album_has_song ON song.id=song_id WHERE album_id=$albumID AND SELECT EXISTS(SELECT * FROM song JOIN album_has_song ON song.id=song_id WHERE album_id=$albumID)");
$query1
和$query2
没有任何问题。现在$query3
..我想检查相册是否有任何歌曲,之后删除某张专辑中的所有歌曲。
答案 0 :(得分:1)
您需要使用foreign key并使用一个查询" DELETE CASCADE"您可以删除所有表中的所有行。
参见示例here。
答案 1 :(得分:0)
除了接口和SQL注入问题(稍后修复),但要使逻辑正常工作:
$query3 = mysql_query("DELETE FROM song JOIN album_has_song ON song.id=song_id WHERE album_id=$albumID AND EXISTS(SELECT * FROM song JOIN album_has_song ON song.id=song_id WHERE album_id=$albumID)");
答案 2 :(得分:0)
有多种方式 - 但如果您需要在事务上安全(即,您希望一切都“发生”,那么它们会变得更小),因此同时运行的其他任何内容都不会混淆或导致数据不一致)。
一种(有两种)显而易见的方法是使用foreign keys。
这些概念很简单 - 它们强制执行referential integrity - 也就是说它们强制一个表中的数据只有在另一个表中的数据匹配时才能存在(例如,如果一首歌只能存在于专辑中,专辑存在)。
使用普通的SQL设置外键有点麻烦,任何半个体面的MySQL图形客户端都可以轻松实现。
MySQL中用于解决问题的外键的主要功能是referential actions。您可以指示MySQL删除cascade
,因此如果您的相册被删除,所有相关的歌曲都会随之删除。不需要更多编码!
你需要使用一个合适的数据库引擎,比如InnoDB(默认情况下我认为自MySQL 5.6以来)。
浏览一下提供的链接,如果您遇到困难,请告诉我们!