2013-11-15 59 views
2

這看起來在概念上很簡單,但是一旦我將它放入SQL術語中,就很難了。如何爲mysql表中的新列中的每一行生成唯一值?

說一個人在一個名爲「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兼容的方法來做到這一點?我想不出會是什麼。

回答

3

您所查詢的是緩慢的,因爲你的IS NULL條件每次都會產生FULL SCAN - 這是因爲,很明顯,你可以仍然不能使用索引的列(你沒有它尚未)

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

UPDATE stuff CROSS JOIN (SELECT @pk:=0) AS init SET [email protected]:[email protected]+1 
+0

哇。那麼,這看起來不像標準的SQL,但它非常酷。而且速度更快。我一直在使用MySQL一段時間,從來沒有使用變量。猜猜我應該學習。感謝名單 –

相關問題