MySQL更新冲突行以使其唯一
我有一个mysql InnoDB表,其中有一百万行的索引列没有唯一性约束。我希望将冲突行标记为有冲突,然后向该列添加唯一性约束。然后,这些行的所有者将脱机修复它们。以下是我的代码: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
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);