如何通过循环批量清理SQLite数据库中多表重复数据?
批量清理SQLite多表重复数据的实现方法
SQLite本身不支持原生的SQL循环语句,需要借助外部脚本或编程语言来批量遍历表并执行清理操作,以下是两种实用方案:
方案一:Shell脚本(适用于Linux/macOS)
- 导出所有表名到临时文件
sqlite3 your_database.db "SELECT name FROM sqlite_master WHERE type='table';" > tables.txt
- 编写循环脚本执行清理
#!/bin/bash # 替换为你的数据库文件名 DB="your_database.db" # 遍历所有表名执行删除语句 for TABLE in $(cat tables.txt); do sqlite3 $DB "DELETE FROM \"$TABLE\" WHERE EXISTS (SELECT 1 FROM \"$TABLE\" p2 WHERE \"$TABLE\".date = p2.date AND \"$TABLE\".ROWID > p2.ROWID);" echo "已完成表 $TABLE 的重复数据清理" done
方案二:Python脚本(跨平台通用)
用Python连接数据库,批量处理所有表,还能直观看到删除的行数:
import sqlite3 # 替换为你的数据库路径 db_path = "your_database.db" # 建立数据库连接 conn = sqlite3.connect(db_path) cursor = conn.cursor() # 获取所有用户表名 cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") tables = [row[0] for row in cursor.fetchall()] # 逐个清理重复数据 for table in tables: # 拼接删除SQL,用双引号包裹表名避免特殊字符冲突 delete_sql = f''' DELETE FROM "{table}" WHERE EXISTS ( SELECT 1 FROM "{table}" p2 WHERE "{table}".date = p2.date AND "{table}".ROWID > p2.ROWID ) ''' cursor.execute(delete_sql) print(f"表 {table} 清理完成,删除重复数据 {cursor.rowcount} 条") # 提交修改并关闭连接 conn.commit() conn.close()
注意事项
- 先备份数据库:执行删除操作前务必备份,避免数据丢失,备份命令:
sqlite3 your_database.db ".backup backup_$(date +%Y%m%d).db" - 若表名包含空格、SQL关键字等特殊字符,必须用双引号包裹表名,上述两种方案已做处理
- 确保所有表确实包含
date列和ROWID(SQLite默认给表添加ROWID,除非用WITHOUT ROWID创建表)
内容的提问来源于stack exchange,提问作者Hotone
相关产品推荐
相关产品推荐

