代码之家  ›  专栏  ›  技术社区  ›  Derek Adair

根据第三个ID从两个表中删除数据

  •  1
  • Derek Adair  · 技术社区  · 15 年前

    我犹豫是否运行这个删除数据的查询(显然是有原因的)。

    我想从两个表中删除匹配的行,其中id=第三个表的id(我希望不受影响)

    这是我要运行的确切查询:

    DELETE FROM ItemTracker_dbo.Transaction t, 
                ItemTracker_dbo.Purchase p
    USING ItemTracker_dbo.Transaction
    INNER JOIN ItemTracer_dbo.Purchase ON p.Transaction_ID = t.Transaction_ID
    INNER JOIN ItemTracker_dbo.Item i ON i.Item_ID = p.Item_ID
    WHERE i.Client_ID = 1
    

    为了测试这个,我尝试运行一个选择替换 DELETE FROM 具有 SELECT * FROM 我得到一个语法错误“near using”。当我删除 USING ... 它选择表中的每一行(忽略 client_id=1 条款)。

    我(本质上)从 mysql manual (显然替换了这些值)。

    此查询有效吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Clash    15 年前

    很抱歉,我没有发表评论而不是发帖,但我的名声不够好。为什么不将其作为事务运行并查看结果?还是我错过了什么? http://dev.mysql.com/doc/refman/5.0/en/commit.html

        2
  •  2
  •   MBCook    15 年前

    据我所知,你不能这样做。与事务一起完成的方法。

    START TRANSACTION;
    
    DELETE FROM tableOne WHERE criteria;
    
    DELETE FROM tableTwo WHERE criteria;
    
    COMMIT;
    

    如果语句之间出现错误,您可以发出一个回滚,您的数据将在那里。

    渔获量是 这对Myisam不起作用 . myisam不支持事务处理,因此它只会删除数据,而且无法回滚数据。它们必须是innodb表。它静静地做这个。这样我就丢失了一个生产表(幸好我有一个备份,但更新不多)。

    找出表是否是InnoDB的最简单方法?

    SHOW CREATE TABLE tableName;
    

    最后,它将有类似“engine=innodb”或“engine=myisam”的内容。

        3
  •  0
  •   bobince    15 年前

    我不熟悉这个(非标准?)使用 USING 要在上面联接表,但是如果只想从联接中的某些表中删除行,通常的方法是:

    DELETE Purchase, `Transaction`
    FROM Item
    JOIN Purchase ON Purchase.Item_ID=Item.Item_ID
    JOIN `Transaction` ON `Transaction`.Transaction_ID=Purchase.Transaction_ID
    WHERE Item.Client_ID=1;
    

    假设我正确理解你的模式。删除 Transaction 引用自 Purchase 因为这自然会有很多- 购买 一对一 交易 关系。有没有 UNIQUE 约束以确保它是一对一的?如果没有,你能确定没有其他 购买 将引用已删除的 交易 是吗?

    您可以简单地将上述构造测试为select:

    SELECT Purchase.Purchase_ID, `Transaction`.Transaction_ID
    FROM Item ...