【问题标题】:MySQL Deleting row ifMySQL删除行如果
【发布时间】:2015-11-11 19:25:58
【问题描述】:

如果有人能帮我解决这个问题,我会很高兴。我有一个音乐数据库。有 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.. 我想检查专辑是否有任何歌曲,然后删除该专辑中的所有歌曲。

【问题讨论】:

标签: php mysql sql join


【解决方案1】:

您将需要使用foreign key 并且通过一个查询“DELETE CASCADE”,您可以删除所有表中的所有行。

查看示例here。

【讨论】:

  • 你只是打败了我的答案 ;-) 我同意 100%。这是我要采取的方法。
【解决方案2】:

除了接口和 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)");

【讨论】:

    【解决方案3】:

    有多种方法 - 但如果您需要确保事务安全(也就是说,您希望所有事情都“作为一个操作”发生,那么同时运行的其他任何事情都不会混淆或导致数据不一致) )。

    一种(几种)显而易见的方法是使用foreign keys。

    这些在概念上很简单——它们强制执行referential integrity——也就是说,它们强制一个表中的数据只有在另一个表中的数据匹配时才能存在(例如,一首歌只能存在于专辑中,如果专辑存在)。

    使用普通的 SQL 设置外键有点麻烦,任何一个半像样的 MySQL 图形客户端都可以轻松完成。

    MySQL 中将解决您的问题的外键的关键特性是referential actions。您可以指示 MySQL 删除cascade,因此如果您的专辑被删除,所有相关的歌曲都会随之删除。不再需要编码!

    您需要使用适当的数据库引擎,例如 InnoDB(我相信自 MySQL 5.6 以来的默认值)。

    查看提供的链接,如果您遇到问题,请告诉我们!

    【讨论】:

    • 感谢您的解释!这只是一个学校项目,但我还是想学习 MySQL。因此,这些关于“级联”和其他内容的信息有助于让我对编码有更广泛的了解,或者我可以这么说。非常感谢您的帮助!
    • 不客气......不幸的是,学校(或英国的大学 - 我假设你来自美国?)似乎没有教什么是“现实世界“解决问题。他们教“一切正常化”并避开交易安全等......这是一种耻辱,因为一旦你进入现实世界,这些事情就变得很重要。您可能还想查看 PostgreSQL,它是免费的,并且提供了很多 MySQL 没有的很酷的功能。 (这将帮助您了解并非所有数据库都像 MySQL,遗憾的是我毕业时并没有欣赏它 :))
    猜你喜欢
    • 2015-12-25
    • 2014-02-13
    • 1970-01-01
    • 2013-10-10
    • 2014-01-01
    • 2014-01-03
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多