【问题标题】:Why doesn't this MySQL query delete any rows?为什么这个 MySQL 查询不删除任何行?
【发布时间】:2013-03-06 13:52:21
【问题描述】:

从表面上看,我的用例非常简单。我有两张桌子:orderlineorder 包含iddatetimelineorder 表中引用了id。不幸的是,这是一个非常旧的系统,我不能(即不允许修改系统)使用带有更新/删除触发器的外键。

我是reading this question,并编写了自己的查询来做类似的事情。基本上我想在删除订单时删除与order 关联的所有lines,只要该订单超过两年:

DELETE a
FROM 
  `line` AS a
  LEFT JOIN `order` AS b ON a.`order_id` = b.`id`
WHERE
  b.`datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR);

目前什么都没有发生 - 没有行受到影响。将查询更改为仅选择,使用相同的连接和 where 子句,可以很好地返回许多结果。

我在这里错过了什么?

【问题讨论】:

标签: mysql join


【解决方案1】:

文档说tbl_name,而不是table_references。所以这可能有效:

DELETE line
FROM 
  line
  LEFT JOIN `order` AS b ON line.`order_id` = b.`id`
WHERE
  b.`datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR);

【讨论】:

  • 谢谢。我想在不需要子查询的情况下真正做到这一点,你解释了为什么我的不工作。
【解决方案2】:

DELETE命令用于删除整行,所以正确的语法是

DELETE FROM yourtable WHERE...

如果你执行 DELETE (something) FROM 将不起作用

希望对你有帮助

【讨论】:

  • 那个方法也对。 Check 在 mysql 开发页面上。
【解决方案3】:
DELETE FROM 
  `line`
WHERE
   order_id IN 
      (SELECT id
       FROM order
       WHERE `datetime`< DATE_SUB(NOW(), INTERVAL 2 YEAR)

【讨论】:

    【解决方案4】:

    试试这个:

    DELETE FROM `line` WHERE `order_id` IN (SELECT `id` FROM `order` 
    WHERE `datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR));
    

    我可能会更重。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2012-03-20
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多