为baz表添加唯一索引并定位重命名重复label字段
解决为label字段添加唯一索引并处理重复值的问题
没问题,咱们一步步来搞定这个需求——先处理掉重复的label值,再给字段加上唯一索引,完全不用复制整个表,完美适配你只有少量重复项的场景~
第一步:定位并重命名重复的label值
用下面的SQL语句,我们会给每个重复的label加上对应的id后缀(比如第二个foo改成foo_2):
UPDATE baz SET label = CONCAT(label, '_', id) WHERE id IN ( SELECT id FROM ( SELECT id, label, ROW_NUMBER() OVER (PARTITION BY label ORDER BY id) AS rn FROM baz ) AS subquery WHERE rn > 1 );
语句说明:
- 内层子查询用
ROW_NUMBER()窗口函数,给每个相同label的行按id从小到大编号(第一个出现的行编号为1,重复的行编号依次递增) - 外层筛选出编号大于1的行(也就是重复的条目),然后把它们的label更新为
原label_当前id的格式 - 这个操作只会修改那2-3个重复项,完全不会动数千个唯一的字段,效率很高
第二步:为label字段添加UNIQUE索引
等重复值处理完之后,就可以安全地添加唯一索引了:
ALTER TABLE baz ADD UNIQUE INDEX idx_baz_label (label);
可选验证步骤
你可以先执行下面的语句确认所有label都已经唯一:
SELECT label, COUNT(*) FROM baz GROUP BY label HAVING COUNT(*) > 1;
如果返回空结果,就说明重复值已经清理完毕,放心执行添加索引的语句就好~
内容的提问来源于stack exchange,提问作者0leg
相关产品推荐
相关产品推荐

