这在概念上似乎很简单,但是一旦我把它放在 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 的方法来执行此操作?我想不出它会是什么。