我有一个表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语句。
答案 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
值创建另一个表,并在需要时加入值。