SimpleDao

目的

  1. CREATE TABLE `courseword` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `word` varchar(255) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

现状:当前有一个MySQL表courseword, id为自增主键
目的:想要打乱这个表数据的顺序,比如现在表是按word字段的顺序排序,例如:a,b,c,但是想改成随机顺序,例如:b,a,c

思路

1.直接update id这个字段

例如现在有100行数据,那重新排序的话,可以update id这个字段一个不重复的随机值,这样能实现随机顺序。

但是这样做有个坏处就是随机主键id的话插入性能会比较慢,如果数据量大,也不好处理,而且会出现不连续的id值。

2.使用临时表

a.新建一模一样的临时表
  1. CREATE TABLE courseword_tmp LIKE courseword;
b.导入数据
  1. INSERT INTO courseword_tmp (word) SELECT word FROM courseword ORDER BY RAND();

如果表中有多个字段,必须都列出来,例如上面的word字段,但是不能包括id,不然的话,复制过去,id就会一模一样。现在的目的是使用rand()函数,随机打乱顺序,然后插入到临时表中,因为不包括主键id,所以插入到临时表后,数据都是从1开始连续递增的id

c.重命名表
  1. RENAME TABLE courseword TO courseword_bak;
  2. RENAME TABLE courseword_tmp TO courseword;

这样临时表重命名为原来的表名,原来的表名就换成bak的备份表

d.清除原表
  1. DROP TABLE courseword_bak;

如果需要清理旧表,就直接删除

坏处

由于要select全表,而且order by rand(),所以数据量大的话,会很慢