有一张表 T ,几个字段 id, c1, c2 ...,其中 id 为主键。
现在有大量数据需要更新,由于以下原因:
- 后台仍然使用旧的 php 的 mysql 扩展,一次 query 只能包含一条 SQL 语句
- 数据库和脚本不在一台机器,需要考虑网络开销
需要将更新操作合并为一条 SQL 。
目前已知大致有这么几种方法:
INSERT INTO T (id, c1, c2)
VALUES (1, 1, 1), (2, 2, 2)
ON DUPLICATE KEY
UPDATE c1 = c1 + VALUES(c1), c2 = c2 + VALUES(c2);
UPDATE T
SET c1 = c1 + CASE id
WHEN 1 THEN 1
WHEN 2 THEN 2
END,
c2 = c2 + CASE id
WHEN 1 THEN 1
WHEN 2 THEN 2
END
WHERE id IN (1, 2);
UPDATE T t
JOIN (
SELECT 1 as id, 1 as x,
UNION ALL
SELECT 2, 2
) v ON t.id = v.id
SET c1 = c1 + x, c2 = c2 + x;
目前的问题是:
- 方法 1 :因为有其他字段,不希望 id 不存在时 insert ,所以不能使用;
- 方法 2 : c1 和 c2 的增量时相同的,用两个 case...when 感觉没有必要,但又不知道如何只用一个;
- 方法 3 :随着数据量增加,效率显著降低;