关于mysql:如何在现有列中创建唯一的重复项?

How do i make duplicates in a existing column unique?

我使用的是MySQL5.6服务器。我使用navicat在数据库中工作。

我已经搜索并找到了很多可能的解决方法,但没有一个对我有用。

我有一张36000行左右的桌子。我有一个列wich allowes duplicate entry,但我想使行中的重复项唯一。有重复项的列

我可以通过这个查询找到我的副本。但是有很多人手动编辑它们。搜索结果

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

我要找的是一种做这些事情的方法。

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

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

用唯一条目更新整个列。(不重要的是,它的调用者必须是唯一的。)

事先谢谢。

编辑-这里有一个名为id_nb的唯一列。我要更改的列不应是唯一的。


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

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

1
2
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 ) ));

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

1
2
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将不再工作。


我假设您在表中没有唯一的列。如果是这样,您可以对变量执行此操作:

1
2
3
4
5
6
7
8
9
10
11
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"的列。