mysql - 有没有办法将许多 upserts 批量发送到 mysql db?
问题描述
当前进程正在执行如下代码所示的 upsert。
但是,大量的请求似乎会导致问题。
有没有办法用更少的请求来做到这一点?
1.
INSERT INTO example_table (id, prop_a, prop_b) VALUES (1,1,7)
ON DUPLICATE KEY UPDATE prop_a=1,prop_b=7;
-------------------------------------------------------------
id(primary key), prop_a, prop_b, prop_c
1 1 7 0
-------------------------------------------------------------
INSERT INTO example_table (id, prop_b, prop_c) VALUES (1,5,8)
ON DUPLICATE KEY UPDATE prop_b=5,prop_c=8;
-------------------------------------------------------------
id(primary key), prop_a, prop_b, prop_c
1 1 5 8
-------------------------------------------------------------
INSERT INTO example_table (id, prop_a, prop_b) VALUES (7,3,3)
ON DUPLICATE KEY UPDATE prop_a=3,prop_b=3;
-------------------------------------------------------------
id(primary key), prop_a, prop_b, prop_c
1 1 5 8
7 3 3 0
-------------------------------------------------------------
解决方案
INSERT INTO example_table (id, prop_a, prop_b, prop_c)
SELECT 1,1,7,0 UNION ALL
SELECT 1,5,0,8 UNION ALL
SELECT 7,3,3,0
ON DUPLICATE KEY UPDATE
prop_a=CASE WHEN VALUES(prop_a) = 0
THEN COALESCE(prop_a, 0)
ELSE VALUES(prop_a) END,
prop_b=CASE WHEN VALUES(prop_b) = 0
THEN COALESCE(prop_b, 0)
ELSE VALUES(prop_b) END,
prop_c=CASE WHEN VALUES(prop_c) = 0
THEN COALESCE(prop_c, 0)
ELSE VALUES(prop_c) END;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=64a0ef6520c65de8ac7e97ea90dc40d5
推荐阅读
- javascript - 如何设置重启后获取消息的反应收集器?
- r - 有没有办法使用 ggplot 2 中的散点图生成范围图?
- sql - 在 Google BigQuery 中加入两个具有嵌套字段类型“记录”的 PostgreSQL 表
- python - codigo para "hackear" a un usuario
- python-3.x - Python 3.9 已安装但未与 Jupyter Notebook 或 Anaconda 集成(显示)
- r - 调整 R Markdown gt 输出的大小
- c++ - OpenCV C++:在没有 matchTemplate 的情况下实现标准化互相关 (TM_CCORR_NORMED)
- reactjs - Instagram - 兑换代币
- javascript - 尝试通过 React 对 websocket 的一个消息请求设置多个状态时导致浏览器滞后/锁定的原因是什么?
- yarnpkg - 如何使用 Yarn 2+ 列出每个公共工作区?