有一个超过10行的表,现在需要随机地随机播放所有行并在其上创建一个新表。任何想法?
使用select * from table order by random()
似乎很慢。
原始表就像,目标列分为两部分:
+--------+------+--------+------+-----+--------+
| cst_id | name | salary | fund | age | target |
+--------+------+--------+------+-----+--------+
| 1 | a | 100 | Y | 33 | 0 |
| 2 | b | 200 | Y | 21 | 0 |
| 3 | c | 300 | Y | 45 | 0 |
| 4 | d | 400 | N | 26 | 0 |
| 5 | e | 500 | N | 37 | 0 |
| 6 | f | 600 | Y | 56 | 0 |
| 7 | g | 700 | Y | 44 | 0 |
| 8 | h | 800 | N | 22 | 1 |
| 9 | i | 900 | N | 38 | 1 |
| 10 | j | 1000 | Y | 61 | 1 |
| 11 | k | 1100 | N | 51 | 1 |
| 12 | l | 1200 | N | 21 | 1 |
| 13 | m | 1300 | Y | 32 | 1 |
| 14 | n | 1400 | N | 17 | 1 |
+--------+------+--------+------+-----+--------+
after:
+--------+------+--------+------+-----+--------+
| cst_id | name | salary | fund | age | target |
+--------+------+--------+------+-----+--------+
| 1 | a | 100 | Y | 33 | 0 |
| 2 | b | 200 | Y | 21 | 0 |
| 8 | h | 800 | N | 22 | 1 |
| 9 | i | 900 | N | 38 | 1 |
| 3 | c | 300 | Y | 45 | 0 |
| 13 | m | 1300 | Y | 32 | 1 |
| 14 | n | 1400 | N | 17 | 1 |
| 5 | e | 500 | N | 37 | 0 |
| 6 | f | 600 | Y | 56 | 0 |
| 7 | g | 700 | Y | 44 | 0 |
| 10 | j | 1000 | Y | 61 | 1 |
| 11 | k | 1100 | N | 51 | 1 |
| 4 | d | 400 | N | 26 | 0 |
+--------+------+--------+------+-----+--------+
答案 0 :(得分:0)
以下说明是从现有的表创建新表,其中包含与洗牌行相同的数据(相同的模式)。
创建一个新表并从第一个表中导入所有这些行和记录,由RAND()SQL函数随机选择和排序:
CREATE TABLE new_table SELECT * FROM old_table ORDER BY RAND()
或者,如果您创建了一个与旧结构相同的表,请改用INSERT INTO:
INSERT INTO new_table SELECT * FROM old_table ORDER BY RAND()
当然,如果您想保留每一行的主键标识,那么由于遗留代码和数据实体关系,这很可能是您要对旧表执行的操作。但是,如果您希望一个包含所有洗牌记录的新旧表按顺序完全重新排列,就好像它是针对不同的应用程序一样,您可以通过不导入旧表的ID字段来忽略主键或ID。
例如,您在旧表中将ID,col1和col2作为数据字段。要创建旧表的新的重新排序或洗牌行版本:
CREATE TABLE new_table SELECT col1, col2 FROM old_table ORDER BY RAND()
新的主键ID将自动分配给新表中的每一行。
但在SQL中,关系没有秩序。关系数据库中的行未排序。检索时您可能会得到不同的订单。