【问题标题】:How do i make duplicates in a existing column unique?如何使现有列中的重复项唯一?
【发布时间】:2018-01-21 10:05:43
【问题描述】:

我正在使用 MySQL 5.6 服务器。我使用 Navicat 在数据库中工作。

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

我有一个大约 36000 行的表。我有一列允许重复条目,但我想让行中的重复项唯一。 Column with duplicates

我可以使用此查询找到我的重复项。 但是有很多手动编辑它们。 Search Result

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

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

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

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

使用唯一条目更新整个列。 (不管它的调用是什么都必须是唯一的。)

提前致谢。

编辑 - 已经有一个名为 Id_nb 的唯一列。 我要更改条目的列不应该是唯一的。

【问题讨论】:

  • 表中有唯一的列吗?
  • 是的,我有一个独特的专栏。

标签: mysql sql duplicates navicat


【解决方案1】:

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

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_nb。
  • 嗯,它似乎有点工作。它从 560 多个重复项变为 27 个重复项。我想我可以手动修复其余部分。感谢戈登的帮助。
【解决方案2】:

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

假设您有一个名为 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 将不再起作用。

【讨论】:

  • 第三个几乎只是清除列中的所有条目并从头开始使用唯一条目。像 1 2 3 4 等。不过,我从 Gordon 那里得到的答案效果很好。也要试试这两个,看看它是如何工作的。
  • 两个都试过了。似乎无法让他们工作。可能应该说我对这个数据库的东西有点新。我是否将 2x id 更改为我的唯一 id 列?
  • 首先,是的,您应该将所有“id”更改为“Id_nb”
  • 其次,如果ItemTemplate_ID列已经是唯一的,那这两个就不再起作用了。
  • 尝试第二个查询时出现错误。 [SQL] update itemtemplate set ItemTemplate_ID = (select md5(uuid())), PackageID='Duplicates' where FIND_IN_SET(Id_nb,(SELECT GROUP_CONCAT(Id_nb) FROM itemtemplate GROUP BY ItemTemplate_ID HAVING ( COUNT(ItemTemplate_ID) > 1 ) )) ; [Err] 1093 - 您不能在 FROM 子句中指定目标表 'itemtemplate' 进行更新
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 2018-04-02
  • 2016-07-02
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2019-04-02
相关资源
最近更新 更多