我有一个大数据库,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 |
答案 0 :(得分: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)
请参阅小提琴here。
修改强>
如上所述,此解决方案仅在没有以点和数字结尾的记录时才起作用,例如,如果您有这些记录,它将失败:
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]*$'
(这是一个从这个answer获得的轻微修改和修复的查询。)
即使这会让事情变得复杂一些,我认为计算一个计数器要好得多,而不是公开内部ID(名为alex.2
的帐户看起来比名为alex.78964
的帐户要好得多...)。
小提琴是here。