MySQL更新冲突行以使其唯一

MySQL更新冲突行以使其唯一,mysql,sql,Mysql,Sql,我有一个mysql InnoDB表,其中有一百万行的索引列没有唯一性约束。我希望将冲突行标记为有冲突,然后向该列添加唯一性约束。然后,这些行的所有者将脱机修复它们。以下是我的代码: UPDATE users u SET fid = concat("@conflict_", fid, "_", RAND()) WHERE u.fid IN (SELECT fid from ( SELECT fid FROM users WHERE f

我有一个mysql InnoDB表,其中有一百万行的索引列没有唯一性约束。我希望将冲突行标记为有冲突,然后向该列添加唯一性约束。然后,这些行的所有者将脱机修复它们。以下是我的代码:

UPDATE users u SET fid = concat("@conflict_", fid, "_", RAND())
WHERE u.fid IN (SELECT fid from (
    SELECT fid
    FROM users
    WHERE fid IS NOT NULL
    GROUP BY fid
    HAVING COUNT(fid) > 1) 
AS TmpUsers);
上面的查询非常慢。更新需要几个小时。有什么好方法可以加快速度

使现代化 永远不要使用子查询来更新包含大量记录的表。在以下位置找到示例联接:


谢谢@Powerlord。

试试这样的东西:

create temporary table myCustomTable as (
SELECT fid
FROM users
WHERE fid IS NOT NULL
GROUP BY fid
HAVING COUNT(fid) > 1);

UPDATE users u SET u.fid = concat("@conflict_", u.fid, "_", RAND())
WHERE u.fid IN (select mc.fid from myCustomTable mc);

您不能将sub和subsub更改为一个子选择吗?抛出一个错误,您无法在FROM子句中指定更新的目标表“u”。在更新fid值之前,它需要一个临时表来存储fid值列表。作为另一个用户,在选择中。。。作为MySQL上的依赖子查询调用。这意味着它对用户表中的每一行运行一次。因为它会返回多个结果,这显然是一件坏事。@Powerlord非常感谢。我把它转换成了一个连接,这对我来说很有帮助。从来不知道子查询有这么慢。在FROM子句中无法指定更新的目标表“u”。第二个仍然需要时间。我是根据@Powerlord的评论得到答案的。乔伊成功了。
create temporary table myCustomTable as (
SELECT fid
FROM users
WHERE fid IS NOT NULL
GROUP BY fid
HAVING COUNT(fid) > 1);

UPDATE users u SET u.fid = concat("@conflict_", u.fid, "_", RAND())
WHERE u.fid IN (select mc.fid from myCustomTable mc);