【发布时间】:2013-11-15 06:20:12
【问题描述】:
这在概念上似乎很简单,但是一旦我将其放在 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 的方法来执行此操作?我无法想象它会是什么。
【问题讨论】: