【问题标题】:Mysql - delete with join vs two delete statementsMysql - 使用连接删除与两个删除语句
【发布时间】:2014-02-19 06:50:05
【问题描述】:

我有两个带有相关键的表。我想选择从具有相关键的 tbl_one 和 tbl_two 行中删除行的最佳方法。我尝试使用 DELETE JOIN 来正确执行此操作,但我发现了另一种非常简单的方法,即使用两个删除语句。你能告诉我哪个更好吗?

第一种方法:

DELETE tbl_one,
tbl_two FROM tbl_one 
JOIN tbl_two ON tbl_one.id = tbl_two.tbl_one_id WHERE tbl_one.id = 1

第二种方法:

DELETE FROM tbl_one WHERE id =1;
DELETE FROM tbl_two WHERE tbl_one_id =1;

【问题讨论】:

  • 最好的选择是使用级联删除来定义参照完整性

标签: mysql sql


【解决方案1】:

操作的主要关注点应该单独完成(要么两者都做,要么都不做) 您应该将操作放在事务块中。 在我看来,第一个查询效果更好,因为服务器可以通过单个查询而不是解析和执行两个查询到达保存点。

关闭 foreign_key_check 全局变量并运行查询,然后再将其打开。

注意:您可以使用 mysql 提供的级联外键行为。

【讨论】:

    【解决方案2】:

    使用单个或多个语句来更改数据库内容并不重要,只要您使用事务即可。如果没有事务,可能会出现两个问题:

    1. 另一个访问数据的进程中间您运行一个又一个语句查询数据库的“不干净”状态,因为只有部分语句已被处理。这可能总是发生在多个客户端可以同时使用数据库的系统中,例如在网页等中。

    2. 无论出于何种原因,后续查询都可能失败。在这种情况下,只有您的部分陈述已被处理,另一部分则没有。这会使您的数据库再次处于“未定义”状态,在这种情况下是一种持续存在的情况。您必须通过错误检测手动防止这种情况发生,但即便如此,也可能根本无法解决问题。

    关系数据库管理系统为此提供transactions。从逻辑的角度来看,事务允许将多个语句“捆绑”成单个语句。你开始一个事务,运行你的语句,然后关闭事务。如果发生意外情况,您始终可以“回滚”您的事务,这样您就可以获得稳定且干净的数据库情况,就像在事务开始之前一样。

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 1970-01-01
      • 2016-07-09
      • 2010-12-31
      • 2013-04-25
      • 1970-01-01
      • 2011-09-01
      • 2013-04-02
      • 2011-10-31
      相关资源
      最近更新 更多