如何在MySQL表中永久地洗牌id?

如何在MySQL表中永久地洗牌id?,mysql,Mysql,我有一个简单的表,具有以下结构和许多行: id | name | title | ------------------------------ 需要用其他值替换id,换句话说,我需要永久地洗牌我的表。我需要运行什么查询?这个查询我只需要运行一次。。。无论需要多长时间或内存。以下查询都应执行以下操作: 整个id集将与以前一样,只需洗牌id; tbl是需要更新的 tbl2为tbl生成一个随机行数 tbl3为tbl3生成与上述行数不同的随机值 当tbl2.row_num1=tbl

我有一个简单的表,具有以下结构和许多行:

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

需要用其他值替换id,换句话说,我需要永久地洗牌我的表。我需要运行什么查询?这个查询我只需要运行一次。。。无论需要多长时间或内存。

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

整个id集将与以前一样,只需洗牌id; tbl是需要更新的 tbl2为tbl生成一个随机行数 tbl3为tbl3生成与上述行数不同的随机值 当tbl2.row_num1=tbl3.row_num2时,洗牌完成
以下查询应执行以下操作:

整个id集将与以前一样,只需洗牌id; tbl是需要更新的 tbl2为tbl生成一个随机行数 tbl3为tbl3生成与上述行数不同的随机值 当tbl2.row_num1=tbl3.row_num2时,洗牌完成
考虑到您的行大小为800,您可以执行以下操作:

使用表的所有记录创建临时表

e、 g.从表格中选择*创建表格TMP表格

把桌子放在你的桌子上

创建表格您的表格从TMP表格中按兰德顺序选择* DROP TABLE TMP_TABLE。
考虑到您的行大小为800,您可以执行以下操作:

使用表的所有记录创建临时表

e、 g.从表格中选择*创建表格TMP表格

把桌子放在你的桌子上

创建表格您的表格从TMP表格中按兰德顺序选择* DROP TABLE TMP_TABLE。 您可以使用shuffle逻辑来使用数据库视图

否则,请使用另一个表备份当前表,然后从备份表中选择“洗牌行”。然后截断您的表,然后从备份表的select查询中插入洗牌行

您可以使用洗牌逻辑使用数据库视图


否则,请使用另一个表备份当前表,然后从备份表中选择“洗牌行”。然后截断您的表,然后从备份表的select查询中插入洗牌行

你不能给现有的id添加一个随机数吗?或者你想排列它们吗?物理地洗牌到行还是只需要更改id列?我需要物理地洗牌行,整个集合id可能与以前相同,但它不必如此。我目前的身份证范围是1-800?你不能给现有的身份证添加一个随机数吗?或者你想排列它们吗?物理地洗牌到行还是只需要更改id列?我需要物理地洗牌行,整个集合id可能与以前相同,但它不必如此。我当前的id范围是1-800?你能解释一下它的作用吗?:@DylanSu他是说:@shmosel确切地说:你能解释一下它的作用吗?:@DylanSu他是说:@shmosel确切地说:我的列id,确实是自动递增的。它改变了什么吗?:@Bartłomiejsemanńczyk,它不应该改变。@Bartłomiejsemanńczyk,我想没有。我的列id,确实是自动递增的。它改变了什么吗?:@Bartłomiejsemanńczyk,它不应该改变。@Bartłomiejsemanńczyk,我想没有。
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;