【问题标题】:MySQL delete from 3 tablesMySQL 从 3 个表中删除
【发布时间】:2010-02-28 18:49:09
【问题描述】:

我有以下表格,我的数据库中有这些键:

预订 session_id

会话 session_id course_id

课程 course_id

我想创建一个查询以删除与单个课程 (course_id) 相关的所有日期。例如,如果我想删除 course_id=10,我希望删除所有 course_id=10 的会话,此外,与任何这些会话关联的任何预订也需要删除。

这可能吗?处理它的最佳方法是什么? (我是用 PHP 写的。)

非常感谢任何帮助!

【问题讨论】:

  • 会话表是否使用 session_id 键引用自身?

标签: php sql mysql database


【解决方案1】:

MySQL supports multi-table deletes:

DELETE FROM BOOKINGS 
 USING BOOKINGS JOIN SESSIONS JOIN COURSES
 WHERE BOOKINGS.session_id = SESSIONS.session_id
   AND SESSIONS.course_id = COURSES.course_id
   AND COURSES.course_id = ?

另一种选择是使用stored procedure,并以正确的顺序处理删除:

  1. 预订

    DELETE FROM BOOKINGS
     WHERE EXISTS(SELECT NULL
                    FROM SESSIONS s 
                   WHERE s.session_id = session_id
                     AND s.course_id = ?)
    
  2. 会议

    DELETE FROM SESSIONS
     WHERE EXISTS(SELECT NULL
                    FROM COURSES c
                   WHERE c.course_id = course_id
                     AND c.course_id = ?)
    
  3. 课程

    DELETE FROM COURSES
     WHERE course_id = ?
    

【讨论】:

  • 我提出的解决方案除了依赖于使用 InnoDB 引擎之外还有其他缺点吗?此外,它是键的 _id。
  • @Adriano Varoli Piazza: DELETE ON CASCADE 不是推荐的做法,因为其他人不一定知道它已经到位并最终清除了他们不应该拥有的数据。虽然看起来工作量更大,但最好的方法是明确说明正在做什么。
  • 您好,感谢您的回复,我正在尝试使用第一种多重删除方法:从预订、会议、课程中删除使用预订加入会议加入课程在哪里预订.session_id=sessions.session_id 和会议.course_id=courses.course_id AND courses.course_id="13" 这似乎不起作用 - 我的语法正确吗? -谢谢!
  • 如果不使用事务,不要使用一系列相关操作
  • @bart:是的,这就是我提到“存储过程”的原因。
【解决方案2】:

我认为最好的方法是配置表添加适当的外键(您必须使用 InnoDB 才能在 mysql 中实际工作)并将 FK 的行为设置为“ON DELETE CASCADE”。这样,当您从课程表中删除某些内容时,相关的预订和会话将被自动删除。

一些链接:

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2019-06-04
    • 2012-07-28
    相关资源
    最近更新 更多