2

这在概念上似乎很简单,但是一旦我把它放在 SQL 术语中,它就变得困难了。

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

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

假设我想添加一个 pk 列并为其赋予唯一值。在更新第一行而不是第三行的更新中,我没有可以提供的 SQL。但事实证明,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 的方法来执行此操作?我想不出它会是什么。

4

1 回答 1

3

您的查询很慢,因为您的IS NULL条件FULL SCAN每次都会产生 - 那是因为,显然,您仍然不能在列上使用索引(您还没有)

您可以使用 MySQL变量来生成您的唯一值。那将是:

UPDATE stuff CROSS JOIN (SELECT @pk:=0) AS init SET stuff.pk=@pk:=@pk+1
于 2013-11-15T06:25:16.163 回答