我有两个InnoDB表,让我们称之为tableD和tableC。 TableD具有带varchar主键的行,称为id。 TableC具有名为seq的BIGINT主键和名为f_id的另一个varchar列。 f_id的值不是唯一的,并且对应于tableC中的id列。
我想要实现的是删除tableD中的所有行,除了那些与tableC中任何行中的f_id列匹配且seq列值大于特定值的行。
以下是我现在的查询:
delete d from tableD as d
where d.id not in (
select c.f_id from tableC as c
where seq>1401399893702598
);
虽然这样做了,但是这个查询将针对大型表运行,在GB范围的10s内有数百万行。它不需要是实时的,但更快更好。所以我试图找出是否有可能消除这个子查询,可能用连接替换它。我认为我必须将此作为单个查询保留,因为可以随时将行添加到任一表中,并且不应出于任何原因删除这些新行。
到目前为止,我在所有尝试中都失败了。我得到的关闭是以下查询,它只删除我想要保留的行并保留其他所有行:
delete d from tableD as d
left join tableC as c on d.id=c.f_id
where c.seq>1401399893702598;
我正在使用MySQL 5.6。
答案 0 :(得分:0)
您需要将seq
上的条件移至on
子句,并在where
子句中测试不匹配:
delete d
from tableD as d left join
tableC as c
on d.id = c.f_id and c.seq > 1401399893702598
where c.f_id is null;