从表面上看,我的用例非常简单。我有两个表:order
和line
。 order
包含id
和datetime
,line
在id
表中引用order
。不幸的是,这是一个非常古老的系统,我不能(即不允许修改系统)使用带有更新/删除触发器的外键。
我是reading this question并写了我自己的查询来做类似的事情。基本上我想在订单被删除时删除与line
相关联的所有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);
目前没有任何事情发生 - 没有行受到影响。将查询更改为仅使用相同的join和where子句进行选择,可以很好地返回一些结果。
我在这里缺少什么?
答案 0 :(得分: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);
答案 1 :(得分:1)
DELETE命令用于删除整行,因此正确的语法是
DELETE FROM yourtable WHERE...
如果你执行DELETE(某事)FROM将无法正常工作
希望有所帮助
答案 2 :(得分:0)
DELETE FROM
`line`
WHERE
order_id IN
(SELECT id
FROM order
WHERE `datetime`< DATE_SUB(NOW(), INTERVAL 2 YEAR)
答案 3 :(得分:0)
试试这个:
DELETE FROM `line` WHERE `order_id` IN (SELECT `id` FROM `order`
WHERE `datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR));
我可能会更重。