【问题标题】:How can one generate unique values for each row in a new column in a mysql table?如何为 mysql 表的新列中的每一行生成唯一值?
【发布时间】: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 的方法来执行此操作?我无法想象它会是什么。

【问题讨论】:

    标签: mysql sql unique


    【解决方案1】:

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

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

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

    【讨论】:

    • 哇。好吧,这看起来也不像标准 SQL,但它非常酷。而且速度更快。我使用 MySQL 已经有一段时间了,从来没有使用过变量。我想我应该学习。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多