
有一张表 T ,几个字段 id, c1, c2 ...,其中 id 为主键。
现在有大量数据需要更新,由于以下原因:
需要将更新操作合并为一条 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 shoaly 2016-04-22 22:25:59 +08:00 有 php 代码 就肯定能找到 mysql 的 访问账号, 直接重新写就可以, 抛开 老代码? |
2 hp3325 2016-04-22 23:07:55 +08:00 不能用事务来处理? |
3 cxbig 2016-04-22 23:16:21 +08:00 |
4 skydiver 2016-04-22 23:25:53 +08:00 via iPad 大量数据不应该直接 load data 么…… |
5 billgreen1 2016-04-23 00:34:53 +08:00 via iPhone 我一般都删除然后插入 |
6 liberize OP |
7 liberize OP @billgreen1 不能删啊,有其他字段。 |
8 zhujinliang 2016-04-23 08:51:01 +08:00 via iPhone 我一般先做一个临时表,把要更新的 ID 和对应的新值写进去,然后用 UPDATE … INNER JOIN 临时表 来更新 做临时表时可以批量 INSERT ,而且实际更新只发生在 update 语句,如果中间出错,丢弃临时表即可 |