如何根据table2的数据删除table1中的对应匹配记录
如何删除table1中与table2完全匹配的106条记录
已知两张表结构完全一致:table1存储100万条数据,table2存储106条待匹配的目标数据,均包含id、date、param0、param1、param2字段,可按以下步骤操作:
前置校验(必做,避免误删)
删数据前必须先确认匹配逻辑准确,先执行查询统计匹配到的记录数:
SELECT COUNT(*) FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id AND t1.date = t2.date AND t1.param0 = t2.param0 AND t1.param1 = t2.param1 AND t1.param2 = t2.param2;
只有当该查询返回结果为106时,才可以继续执行删除操作。如果返回数量不对,先排查两张表是否存在空值、重复数据问题,提前修正。
稳妥起见可以先把匹配到的106条数据导出备份,方便误操作时快速回滚。
正式删除语句
根据你用的数据库类型选对应写法即可,因为table2只有106条数据,优化器会自动用小表驱动大表,只要id字段建了普通索引/主键,哪怕table1有100万条数据,执行速度也很快,不会长时间锁表。
MySQL 适用写法
DELETE t1 FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id AND t1.date = t2.date AND t1.param0 = t2.param0 AND t1.param1 = t2.param1 AND t1.param2 = t2.param2;
PostgreSQL/Oracle 适用写法
用EXISTS语义更严谨,对空值的兼容逻辑更好:
DELETE FROM table1 t1 WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t1.id = t2.id AND t1.date = t2.date AND t1.param0 = t2.param0 AND t1.param1 = t2.param1 AND t1.param2 = t2.param2 );
注意事项
- 不推荐用多字段
IN的写法,部分老版本数据库不支持多字段并列IN,且当字段存在NULL值时,等号匹配会失效(NULL和任何值做=判断都不会返回真),如果业务上字段允许存NULL,需要把每个字段的关联条件改成t1.xx = t2.xx OR (t1.xx IS NULL AND t2.xx IS NULL)的形式,避免漏匹配。 - 删除完成后可以再执行一次前置校验的count查询,返回结果为0就说明目标记录已经全部清理完成。
内容的提问来源于stack exchange,提问作者Andrey Romanov
相关产品推荐
相关产品推荐

