mysql 如何使现有列中的重复项唯一?

u0sqgete  于 2023-06-28  发布在  Mysql
关注(0)|答案(2)|浏览(122)

我使用的是MySQL 5.6服务器。我使用Navicat在DB中工作。
我已经寻找并找到了很多可能的解决方案,但没有一个对我有用。
我有一个大约有36000行的表。我有一个允许重复条目的列,但我想使行中的重复项唯一。Column with duplicates
我可以使用此查询查找重复项。但是有太多的手动编辑他们所有。Search Result

SELECT name, COUNT(ItemTemplate_ID) 
FROM itemtemplate
GROUP BY ItemTemplate_ID
HAVING ( COUNT(ItemTemplate_ID) > 1 )

我正在寻找的是一种方法来做这些事情之一。

用新的唯一条目更新重复项。
**为每个重复项在另一列中添加文本条目。(我有几个空列,我也可以用来添加一些文本。
**使用唯一条目更新整个列。(不在乎它叫什么,它必须是独一无二的。

先谢谢你了。
编辑-已经有一个名为Id_nb的唯一列。要在其中更改条目的列不应是唯一的。

mfuanj7w

mfuanj7w1#

让我假设您在表中没有唯一的列。如果是这样,你可以用变量来做:

set @rn := 0;
set @it := '';

update itemtemplate it
    set it.ItemTemplate_ID = (case when @it = it.ItemTemplate_ID
                                   then concat_ws('_', it.name, (@rn := @rn + 1))
                                   when @it := it.ItemTemplate_ID
                                   then if(@rn := 0, it.ItemTemplate_ID, it.ItemTemplate_ID)
                                   else if(@rn := 0, it.ItemTemplate_ID, it.ItemTemplate_ID)
                              end)
    order by it.ItemTemplate_ID;

此方法假设不存在名称为“ABC”和“ABC_1”的列。

zmeyuzjn

zmeyuzjn2#

用新的唯一条目更新重复项。

假设您有一个名为id的唯一列。

update itemtemplate set ItemTemplate_ID = (select md5(uuid())) where 
FIND_IN_SET(id,(SELECT GROUP_CONCAT(id) FROM itemtemplate GROUP BY ItemTemplate_ID HAVING ( COUNT(ItemTemplate_ID) > 1 ) ));

为每个重复项在另一列中添加文本条目。(我有几个空列,我可以用来添加一些文本。

update itemtemplate set ItemTemplate_ID = (select md5(uuid())), emptyColumn='text' where 
FIND_IN_SET(id,(SELECT GROUP_CONCAT(id) FROM itemtemplate GROUP BY ItemTemplate_ID HAVING ( COUNT(ItemTemplate_ID) > 1 ) ));

对不起,第三个问题我不太明白。顺便说一下,如果你已经执行了第一个SQL,第二个SQL将不再工作。

相关问题