Posts Tagged ‘冗余数据’

数据库清除冗余数据的常用SQL脚本(初级)

星期三, 六月 5th, 2013 26 views

最近项目的数据库要清理一些冗余数据,冗余数据主要来自于一些死账号即长期不登录的玩家或帐户余额长期为0的玩家,基本方法就是使用SQL脚本进行批量删除。同时冗余数据大多不会只存在一个表中,因此还需要跨表进行操作。

①单个表日期筛选删除
首先是日期筛选,比如需要过滤出最后登录日期在多少年月日以前的帐号。
这里对日期筛选的脚本如下:
如删除最后登录日期在2013年1月1日0点0分之前的帐号:

1
DELETE FROM [玩家表] WHERE 最后登录日期字段名 <  '2013-1-1 00:00:00'

如果查找之后的使用大于号”>”即可

②表连接进行跨表删除
比如此时需要删除最后登录日期在2013年1月1日并且其账户余额为0的玩家帐号:

1
2
DELETE FROM [玩家表] WHERE  最后登录日期字段名 < '2013-1-1 00:00:00' AND 用户ID字段 IN
(SELECT 用户ID字段 FROM [账户表] WHERE 余额字段 = 0)

此方法为一个嵌套查询,即先在玩家表中寻找余额为0的行,再在这些行中筛选出登录日期小于13年1月1日的行并删除。通常嵌套查询会比较慢但利于理解。

③清除其他表中的无效数据
当执行了第二步操作后,玩家表中满足条件的行都将被删除,但此时账户表中该玩家的信息尚未删除,此时只需要做一个对比即可,即删除存在一个表(玩家表)而不在另一个表(账户表)中的数据。
依旧用嵌套查询的方法吧

1
2
DELETE FROM [账户表] WHERE 用户ID字段 NOT IN
(SELECT 用户ID字段 FROM [玩家表])

以上脚本即可简单的删除一些定向抛弃的数据库的冗余信息,当然由于方法相对初级因此执行效率有待提高,但对于手动脚本操作来说基本影响不大。

总结:
通过对以上三段代码的举一反三,即可完成大多数数据库的冗余数据清除。
欢迎大家提出更优秀高效的方案,后期我也会陆续更新一些更高级的冗余数据清理方案,本篇到此,谢谢关注。

BeiTown
2013.06.05