2

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

我正在阅读这个问题并编写了自己的查询来做类似的事情。基本上,只要订单超过两年,我就想删除line与删除订单相关的所有 s :order

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 子句,可以很好地返回许多结果。

我在这里想念什么?

4

4 回答 4

2

医生说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);
于 2013-03-06T14:01:46.490 回答
1

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

DELETE FROM yourtable WHERE...

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

希望能帮助到你

于 2013-03-06T13:55:35.027 回答
0
DELETE FROM 
  `line`
WHERE
   order_id IN 
      (SELECT id
       FROM order
       WHERE `datetime`< DATE_SUB(NOW(), INTERVAL 2 YEAR)
于 2013-03-06T13:59:06.177 回答
0

尝试这个:

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

可能我更重。

于 2013-03-06T14:05:23.433 回答