如何永久地将我的MySQL表中的id洗牌?

时间:2016-04-05 05:54:32

标签: mysql

我有一个简单的表,结构如下,行数很多:

 id     | name    | title   |
------------------------------

需要将id替换为其他值,换句话说,我需要永久随机播放我的表格。我需要运行什么查询?这个查询我需要运行一次......无论需要多长时间或内存。

3 个答案:

答案 0 :(得分:2)

以下查询应该执行以下操作:

  
      
  • 整个id设置将与之前相同,只需将iid洗牌;
  •   
  • tbl是要更新的
  •   
  • tbl2tbl
  • 生成随机row_num   
  • tbl3tbl3
  • 生成随机(不同于以上)row_num   
  • 使用tbl2.row_num1 = tbl3.row_num2,随机播放
  •   
UPDATE tbl INNER JOIN 
    (SELECT *, (@rm1 := @rm1 + 1) as row_num1 FROM tbl CROSS JOIN (SELECT @rn1 := 0) param ORDER BY RAND()) tbl2 
        ON tbl.id = tbl2.id
    INNER JOIN
    (SELECT *, (@rm2 := @rm2 + 1) as row_num2 FROM tbl CROSS JOIN (SELECT @rn2 := 0) param ORDER BY RAND()) tbl3
        ON tbl2.row_num1 = tbl3.row_num2
SET tbl.id = tbl3.id;

答案 1 :(得分:2)

考虑到您的行大小为800,您可以执行类似下面的操作:

  • 创建一个包含表格所有记录的临时表。

    e.g。 CREATE TABLE TMP_TABLE (SELECT * FROM YOUR_TABLE)

  • DROP TABLE YOUR_TABLE;

  • CREATE TABLE YOUR_TABLE (SELECT * FROM TMP_TABLE ORDER BY RAND() )
  • DROP TABLE TMP_TABLE;

答案 2 :(得分:0)

您可以使用shuffle logic

将数据库VIEW用于您的目的

否则使用另一个表来备份当前表,然后SELECT从备份表中随机播放行。然后TRUNCATE表,然后从备份表的select查询中插入shuffle行。