You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过文本文件保留指定ID,批量删除数据库多表大量冗余数据?

问题解答

1. 能否通过保留ID列表删除非指定数据?

完全可以,核心逻辑是让数据库识别出不在保留列表内的记录并执行删除,具体有两种常用实现方式:

方式一:直接用IN子句删除

把文本文件里的ID整理成逗号分隔的格式(如1,2,3,...,18000),然后执行删除语句:

DELETE FROM your_table_name
WHERE item_id NOT IN (1, 2, 3, ...); -- 替换为你整理好的ID列表

注意:如果ID列表过长(比如1.8万条),部分数据库会限制IN子句的参数数量,此时建议用下面的临时表方式。

方式二:导入临时表后关联删除

  1. 创建临时表并导入ID列表:
    CREATE TEMPORARY TABLE temp_keep_items (item_id INT PRIMARY KEY);
    -- 以MySQL为例,用LOAD DATA导入文本文件,其他数据库可对应使用导入工具
    LOAD DATA INFILE '/path/to/your/id_list.txt' INTO TABLE temp_keep_items;
    
  2. 关联临时表执行删除:
    DELETE t
    FROM your_table_name t
    LEFT JOIN temp_keep_items k ON t.item_id = k.item_id
    WHERE k.item_id IS NULL;
    

这种方式比IN子句更高效,也能规避ID数量过多的限制。

2. 更优方案建议

结合你EQ Emulator服务器的场景,还有几个关键优化点:

  • 先备份再操作:删除前务必备份目标表(甚至整个数据库),比如用mysqldump(MySQL)或pg_dump(PostgreSQL),防止误删无法恢复。
  • 分批次删除:单表15万+数据量,一次性删除可能锁表影响服务器运行,可按批次执行,比如每次删1000条:
    DELETE FROM your_table_name
    WHERE item_id NOT IN (SELECT item_id FROM temp_keep_items)
    LIMIT 1000;
    
    重复执行直到无符合条件的记录。
  • 多表联动清理:EQ物品数据通常分散在多个关联表(如基础表、特效表、属性表),删除主表记录后,要同步清理关联表冗余数据——若表结构设置了外键级联删除可自动处理,否则手动执行关联删除:
    DELETE e
    FROM item_effects e
    LEFT JOIN temp_keep_items k ON e.item_id = k.item_id
    WHERE k.item_id IS NULL;
    
  • 先验证再删除:执行删除前先确认保留数据量是否正确:
    SELECT COUNT(*) FROM your_table_name WHERE item_id IN (SELECT item_id FROM temp_keep_items);
    
    确保结果和你整理的1.8万条一致后,再执行删除操作。

内容的提问来源于stack exchange,提问作者Bemoretechnical

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:05:48