在mysql中更新具有相同值的多行

时间:2015-06-05 09:33:54

标签: mysql

我有一个表t,列id(主键),a,b,c,d。假设已经填充了列id,a,b和c。我想设置列d = md5(concat(b,c))。现在的问题是这个表包含数百万条记录,而b和c的唯一组合只有几千条。我想节省计算相同值的md5所需的时间。有没有一种方法可以使用相同的值更新此表的多行而无需再次计算md5,如下所示:

update t set d=md5(concat(b,c)) group by b,c;

由于group by不适用于update语句。

2 个答案:

答案 0 :(得分:1)

创建临时表:

    SELECT id_order,lastname,firstname,productName,productPrice
FROM _commandes
WHERE id_order=13
INTO OUTFILE 'C:\Documents and Settings\Stagiaire\Mes documents\Document\bonDeCommandes\No13.txt'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

更新初始表:

CREATE TEMPORARY TABLE IF NOT EXISTS tmpTable 
AS (SELECT b, c, md5(concat(b, c)) as d FROM t group by b, c)

删除临时表:

UPDATE t orig 
JOIN tmpTable tmp ON orig.b = tmp.b AND orig.c = tmp.c
SET orig.d = tmp.d

答案 1 :(得分:1)

一种方法是join

update t join
       (select md5(concat(b, c)) as val
        from table t
        group by b, c
       ) tt
       on t.b = tt.b and t.c = tt.c
     set d = val;

但是,使用数据的任何工作都可能需要比md5()函数更长的时间,因此直接执行update可能是可行的。

编辑:

实际上,更新整个表可能需要一些时间,仅用于更新和日志记录。我建议您完全为b / c / d值创建另一个表,并在需要时加入值。