MariaDB中如何删除随机行并保留固定数量的表记录?
解决MariaDB中保留随机N行并删除其余行的问题
因为MariaDB不允许在NOT IN的子查询里使用LIMIT,可以用以下两种方法实现需求:
方法一:借助临时表
先把要保留的随机ID存入临时表,再通过临时表筛选要删除的行:
-- 创建临时表存储要保留的200个随机ID CREATE TEMPORARY TABLE temp_keep_ids SELECT id FROM table_1 ORDER BY RAND() LIMIT 200; -- 删除不在临时表中的行 DELETE FROM table_1 WHERE id NOT IN (SELECT id FROM temp_keep_ids); -- 临时表会在会话结束后自动销毁,也可手动删除(可选) DROP TEMPORARY TABLE temp_keep_ids;
方法二:使用JOIN关联删除
通过LEFT JOIN匹配要保留的ID,删除匹配不上的行:
DELETE t1 FROM table_1 t1 LEFT JOIN ( SELECT id FROM table_1 ORDER BY RAND() LIMIT 200 ) t2 ON t1.id = t2.id WHERE t2.id IS NULL;
注意事项
- 执行删除操作前务必先备份数据,避免误操作导致数据丢失;
- 如果表的
id字段存在NULL值,NOT IN可能引发异常,此时JOIN方法更稳妥;
内容的提问来源于stack exchange,提问作者Matt Ross
相关产品推荐
相关产品推荐

