-1

我有一个大数据库,NAME 表上有很多重复的值。手动更新它们是不可能的。我试图制作一个程序来添加 ID 的最后一个值并使表唯一,但我失败了。

如何使用 php 或 mysql 更新它们?

这是包含重复值的表的示例。 有 4 个 alex、2 个 shama 和 1 个 jenny 的名字。

| ID | NAME     |
|  1 | alex     |
|  2 | alex     |
|  3 | shama    |
|  4 | jenny    |
|  5 | alex     |
|  6 | shama    |
|  7 | alex     |

这就是我想做的。

这包括重复名称后带有点的 ID

| ID | NAME     |
|  1 | alex     |
|  2 | alex.2   |
|  3 | shama    |
|  4 | jenny    |
|  5 | alex.3   |
|  6 | shama.2  |
|  7 | alex.4   |
4

1 回答 1

0

假设您的表不包含以点+数字结尾的名称,您可以使用以下 UPDATE 查询:

UPDATE
  names INNER JOIN
  (SELECT   n1.id, n1.name, count(n2.id)+1 cnt
   FROM     names n1 INNER JOIN names n2
            ON n1.name=n2.name AND n1.id>n2.id
   GROUP BY n1.id, n1.name) s
  ON names.id = s.id
SET
  names.name = CONCAT(names.name, '.', s.cnt)

在此处查看小提琴。

编辑

如上所述,此解决方案仅在没有以点和数字结尾的记录时才有效,例如,如果您有这些记录,它将失败:

alex
alex
alex.2

而且,您可以使用此解决方案仅修复一次记录。如果您需要插入新记录,则无法再次启动此查询,但您应该使用如下 INSERT 查询:

INSERT INTO names (ID, Name)
SELECT  8,
        CONCAT('alex.',
          COALESCE(MAX(CAST(SUBSTR(Name, LENGTH('alex.')+1, 1) AS UNSIGNED)) + 1,'')
        ) AS Name
FROM    names
WHERE   Name RLIKE '^alex\.[0-9]*$'

(这是从这个答案中获取的经过轻微修改和固定的查询)。

即使这使事情变得更复杂一些,我认为计算一个计数器比公开一个内部 ID 更好(一个名为的帐户alex.2看起来比一个名为alex.78964... 的帐户好得多)。

小提琴在这里

于 2013-06-23T21:10:52.217 回答