如何为mysql表中的新列中的每一行生成唯一值?

时间:2013-11-15 06:20:12

标签: mysql sql unique

这看起来在概念上很简单,但是一旦我把它放在SQL术语中,就很难了。

假设一个表中有3行称为“stuff”。

 col1     col2     col3
 ------   ------   ------
 aaaa     bbbb     cccc
 xxxx     yyyy     zzzz
 aaaa     bbbb     cccc

假设我想添加一个pk列并为其赋予唯一值。在更新中没有SQL可以提供更新第1行而不是第3行。但事实证明,MySQL允许的SQL扩展可以给出答案。

 alter table stuff add column pk int;
 update table set pk = 1 where pk is NULL limit 1;
 update table set pk = 2 where pk is NULL limit 1;
 update table set pk = 3 where pk is NULL limit 1;

这给了我:

 pk       col1     col2     col3
 ------   ------   ------   ------
 1        aaaa     bbbb     cccc
 2        xxxx     yyyy     zzzz
 3        aaaa     bbbb     cccc

但事实证明,如果你使用超过500万行的表来执行此操作,则需要很长时间。我猜想它正在做一大堆工作来找到所有行的pk = NULL,而我真正想要的只是一个。

有谁知道为什么这会慢慢运行?是否有更快或更多SQL兼容的方法来做到这一点?我想不出它会是什么。

1 个答案:

答案 0 :(得分:3)

您的查询速度很慢,因为您的IS NULL条件每次都会生成FULL SCAN - 这是因为,显然,您仍然无法使用列上的索引(您还没有)

您可以使用MySQL variables生成唯一值。那将是:

UPDATE stuff CROSS JOIN (SELECT @pk:=0) AS init SET stuff.pk=@pk:=@pk+1