使用 HAVING 子句更新 MySQL table

UPDATE MySQL table with HAVING clause

我为 table 创建了 slug 字段,它们需要是唯一的,但其中一些不是,所以我想我可以在它们的末尾添加随机字符以使其唯一。

所以这是我的 SELECT 查询:

SELECT slug,count(*) as num FROM table GROUP BY slug HAVING num > 1

这是更新查询:

UPDATE table SET slug = CONCAT(slug,'-',SUBSTRING(MD5(NOW()),1,2))

我无法合并这 2 个查询。

您可以使用 JOIN:

UPDATE mytable AS m
JOIN (SELECT slug
      FROM mytable 
      GROUP BY slug 
      HAVING COUNT(*) > 1) t
ON m.slug = t.slug      
SET m.slug = CONCAT(m.slug,'-',SUBSTRING(MD5(NOW()),1,2))

但是上面的问题是它不会生成唯一的字符串值。

Demo here

解决这个问题的一种方法是使用由变量计算的行号:

UPDATE mytable AS m
CROSS JOIN (SELECT @row_number:=0, @slug := '') AS vars 
JOIN (
   SELECT slug
   FROM mytable 
   GROUP BY slug 
   HAVING COUNT(*) > 1 ) AS t ON m.slug = t.slug       
SET m.slug = CONCAT(m.slug, 
                    '-',
                    IF (@slug = m.slug,
                         IF (@slug := m.slug,@row_number:=@row_number+1, 
                                             @row_number:=@row_number+1),
                         IF (@slug := m.slug, @row_number:=1, 
                                              @row_number:=1)) 
                   )

Demo here

尝试:

UPDATE t ,
(  SELECT slug FROM t 
  GROUP BY slug HAVING count(*) > 1
) x
SET  t.slug = CONCAT(t.slug,'-',SUBSTRING(MD5(rand()),1,2))
WHERE t.slug = x.slug
;

演示:http://sqlfiddle.com/#!9/01c68/1

我使用 rand() 而不是 now() 因为后者不会提供唯一的字符串。