【问题标题】:Multiple delete in a single query在单个查询中多次删除
【发布时间】:2010-09-17 23:38:38
【问题描述】:

从表 1 中删除 WHERE Con​​ditionID=?ConditionID;

DELETE FROM Table2 WHERE ConditionID=?ConditionID;

DELETE FROM Table3 WHERE ConditionID=?ConditionID;

ConditionID 是 Table1,Table2,Table3 中存在的列,而不是单独运行 3 次,有没有办法在单个查询中运行所有三个(在 mysql 中)?

【问题讨论】:

    标签: mysql sql sql-delete multi-table-delete


    【解决方案1】:

    如果三个表的ConditionID 相同,您应该可以使用Multiple Table Delete Syntax

    DELETE Table1, Table2, Table3
    FROM   Table1
    JOIN   Table2 ON (Table2.ConditionID = Table1.ConditionID)
    JOIN   Table3 ON (Table3.ConditionID = Table2.ConditionID)
    WHERE  Table1.ConditionID = ?;
    

    测试用例:

    CREATE TABLE Table1 (id int, ConditionID int);
    CREATE TABLE Table2 (id int, ConditionID int);
    CREATE TABLE Table3 (id int, ConditionID int);
    
    INSERT INTO Table1 VALUES (1, 100);
    INSERT INTO Table1 VALUES (2, 100);
    INSERT INTO Table1 VALUES (3, 200);
    
    INSERT INTO Table2 VALUES (1, 100);
    INSERT INTO Table2 VALUES (2, 200);
    INSERT INTO Table2 VALUES (3, 300);
    
    INSERT INTO Table3 VALUES (1, 100);
    INSERT INTO Table3 VALUES (2, 100);
    INSERT INTO Table3 VALUES (3, 100);
    

    结果:

    DELETE Table1, Table2, Table3
    FROM   Table1
    JOIN   Table2 ON (Table2.ConditionID = Table1.ConditionID)
    JOIN   Table3 ON (Table3.ConditionID = Table2.ConditionID)
    WHERE  Table1.ConditionID = 100;
    
    SELECT * FROM Table1;
    +------+-------------+
    | id   | ConditionID |
    +------+-------------+
    |    3 |         200 |
    +------+-------------+
    1 row in set (0.00 sec)
    
    SELECT * FROM Table2;
    +------+-------------+
    | id   | ConditionID |
    +------+-------------+
    |    2 |         200 |
    |    3 |         300 |
    +------+-------------+
    2 rows in set (0.00 sec)
    
    SELECT * FROM Table3;
    Empty set (0.00 sec)
    

    【讨论】:

    • 优秀,杰出的方法。
    • 不知道这是一个很好的解决方案。如果一个id不在table2,但相同的id在table1table3,那么table1table3中的行会被删除吗?
    【解决方案2】:

    我不知道您的架构是什么样的,但是如果您使用 InnoDB 或类似的表引擎来处理您的表并且您有外键,那么您可以设置条件,在父条目时删除派生条目被删除。有关更多信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

    【讨论】:

      【解决方案3】:

      不。 ConditionID 在每一个中都是独立的——仅仅因为它具有相同的名称并不意味着它是同一列。如果您完全限定名称,您将能够更好地看到它:

      DELETE FROM Table1 WHERE Table1.ConditionID=?ConditionID;
      
      DELETE FROM Table2 WHERE Table2.ConditionID=?ConditionID;
      
      DELETE FROM Table3 WHERE Table3.ConditionID=?ConditionID;
      

      【讨论】:

      • 我想从 3 个表中删除 100 的 Id 值。从表 1 中删除,其中 ConditionID=100;从表 2 中删除,其中 ConditionID=100;从表 3 中删除,其中 ConditionID=100;而不是调用 3 次,是否有使用一些连接的单一方法?
      【解决方案4】:

      您可以通过使用 mysql“删除”查询从多个表中删除行。考虑一下,您有两个表配置文件和书籍。

      个人资料表组成,

      • 身份证
      • 姓名

      books 表包含,

      • pid
      • 价格

      您可以使用此查询从这两个表中删除特定 id 的记录,

      delete profile,books from profile,books where profile.id=18 and profile.id=books.pid;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多