如何使现有列中的重复项唯一?
How do i make duplicates in a existing column unique?
我正在使用 MySQL 5.6 服务器。我使用 Navicat 在数据库中工作。
我已经搜索并找到了很多可能解决我的问题的方法,但其中 none 对我有用。
我有一个 table 大约有 36000 行。我有一列允许重复条目,但我想使行中的重复项唯一。 Column with duplicates
我可以使用此查询找到我的重复项。
但是有很多人需要手动编辑它们。 Search Result
SELECT name, COUNT(ItemTemplate_ID)
FROM itemtemplate
GROUP BY ItemTemplate_ID
HAVING ( COUNT(ItemTemplate_ID) > 1 )
我正在寻找一种方法来完成这些事情。
用新的唯一条目更新重复项。
在另一列中为每个重复项添加一个文本条目。 (我有几个空列也可以用来添加一些文本。
用唯一条目更新整个列。 (不管它的名字是什么,只要是独一无二的。)
提前致谢。
编辑 - 已经有一个名为 Id_nb 的唯一列。
我要更改条目的列不应该是唯一的。
让我假设您在 table 中没有唯一列。如果是这样,你可以用变量来做到这一点:
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".
的列
用新的唯一条目更新重复项。
假设您有一个名为 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将不再起作用。
我正在使用 MySQL 5.6 服务器。我使用 Navicat 在数据库中工作。
我已经搜索并找到了很多可能解决我的问题的方法,但其中 none 对我有用。
我有一个 table 大约有 36000 行。我有一列允许重复条目,但我想使行中的重复项唯一。 Column with duplicates
我可以使用此查询找到我的重复项。 但是有很多人需要手动编辑它们。 Search Result
SELECT name, COUNT(ItemTemplate_ID)
FROM itemtemplate
GROUP BY ItemTemplate_ID
HAVING ( COUNT(ItemTemplate_ID) > 1 )
我正在寻找一种方法来完成这些事情。
用新的唯一条目更新重复项。
在另一列中为每个重复项添加一个文本条目。 (我有几个空列也可以用来添加一些文本。
用唯一条目更新整个列。 (不管它的名字是什么,只要是独一无二的。)
提前致谢。
编辑 - 已经有一个名为 Id_nb 的唯一列。 我要更改条目的列不应该是唯一的。
让我假设您在 table 中没有唯一列。如果是这样,你可以用变量来做到这一点:
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".
的列用新的唯一条目更新重复项。
假设您有一个名为 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将不再起作用。