如何在Android SQLite中删除表内重复的name字段值
如何在SQLite中删除表中name字段的重复值
嘿,别担心,我来一步步给你讲清楚怎么搞定这个问题,咱们分两种场景来处理,你可以根据自己的SQLite版本选合适的方法:
方法一:用窗口函数(推荐,适用于SQLite 3.25.0及以上版本)
这个版本之后的SQLite支持窗口函数,写法更直观,咱们可以给每个name分组后的记录编个号,然后删掉编号大于1的重复项(这里默认保留每个name对应id最小的那条记录,要是想保留最大的,改排序字段就行)。
首先,你可以先运行下面的查询,看看哪些记录是要被删除的,确认没问题再执行删除:
SELECT id, name FROM ( SELECT id, name, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rn FROM your_table_name ) AS temp WHERE rn > 1;
这里的PARTITION BY name是把相同name的记录归为一组,ORDER BY id让组内记录按id从小到大排序,rn就是组内的序号,序号大于1的就是重复的冗余记录。
确认要删除的记录没问题后,执行删除语句:
DELETE FROM your_table_name WHERE id IN ( SELECT id FROM ( SELECT id, name, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) AS rn FROM your_table_name ) AS temp WHERE rn > 1 );
注意:SQLite不允许在DELETE的WHERE子句直接引用正在修改的表,所以得套一层子查询,不然会报错哦。
方法二:兼容旧版本SQLite(无窗口函数)
如果你的SQLite版本比较老,不支持窗口函数,咱们用另一种方式:找出每个name对应的最小id(要保留的记录),然后删除其他同name的记录。
直接执行这条删除语句就行:
DELETE FROM your_table_name WHERE id NOT IN ( SELECT MIN(id) FROM your_table_name GROUP BY name );
要是你想保留每个name对应id最大的那条,把MIN(id)改成MAX(id)就可以了。
重要提醒
- 操作前一定要备份数据表!删除操作是不可逆的,万一写错了还能恢复数据。
- 记得把语句里的
your_table_name替换成你实际的表名哦。
内容的提问来源于stack exchange,提问作者swiftbegineer
相关产品推荐
相关产品推荐

