sql—如何使用mysql中的有序序列信息批量更新数据?

cld4siwp  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(277)

比如说,我有一个只有两个字段的表t,如下所示

ID    VALUE
---------------------
0      100   
0      103   
0      101   
0      102  
...
...
...
0      110,000,000

我需要使用id字段的顺序更新它们并更改表,如下所示:

ID    VALUE
---------------------
1      100   
2      101   
3      102   
4      103   
...
...
...
109999901       110,000,000

如何在mysql中编写sql脚本来实现这一点?在甲骨文里似乎要容易得多。

yftpprvb

yftpprvb1#

一种方法是:

update t join
       (select t.*, row_number() over (order by value) as seqnum
        from t
       ) tt
       on t.value = tt.value
    set t.id = tt.seqnum;

但是,更好的方法可能使用变量:

set @rn := 0;

update t
    set id = (@rn := @rn + 1)
    order by value;

对于这些,您需要一个索引 (value) . 不过,只要创建一个新表,性能就会更好。

rm5edbpk

rm5edbpk2#

如果您使用的是mysql 8+,那么我建议您实际上不要进行此更新,而是使用select和 ROW_NUMBER :

SELECT ROW_NUMBER() OVER (ORDER BY ID), VALUE
FROM yourTable
ORDER BY ID;

如果您经常需要以这种方式查看数据,您还可以将上述选择放入一个视图中并使用它。不想做更新的原因是你应该插入新的 ID 如果值出现在当前序列的中间,则可能会强制您再次运行更新。这可能会成为一个负担后,一段时间。

相关问题