MySQL中通过存储过程实现存储过程结果的Upsert操作
实现Upsert同步ranking_long()结果到dtb_ranking的存储过程
刚好处理过这类同步需求,给你整理个直接落地的方案:
首先得确认dtb_ranking表的product_id字段必须设置为主键或者唯一索引,这是Upsert(存在则更新,不存在则插入)能生效的核心前提——数据库需要靠这个字段判断记录是否重复。
接下来是具体的存储过程代码(以MySQL为例):
DELIMITER // CREATE PROCEDURE SyncRankingData() BEGIN -- 调用ranking_long()获取排名数据,执行Upsert操作 INSERT INTO dtb_ranking (product_id, plg_count, `rank`) SELECT product_id, plg_count, `rank` FROM ranking_long() ON DUPLICATE KEY UPDATE plg_count = VALUES(plg_count), -- 当product_id重复时更新plg_count `rank` = VALUES(`rank`); -- 同时更新rank字段 END // DELIMITER ;
代码说明:
DELIMITER //是临时修改语句结束符,避免存储过程里的分号和默认结束符冲突,写完存储过程后再改回默认的分号INSERT ... SELECT直接把ranking_long()返回的结果集批量导入到dtb_rankingON DUPLICATE KEY UPDATE是MySQL实现Upsert的核心语法:当插入的product_id已经存在于dtb_ranking(触发主键/唯一键冲突),就执行后面的更新逻辑,把对应的plg_count和rank替换成新值
额外注意点:
- 如果你的数据库是PostgreSQL,语法会略有不同,需要用
INSERT ... ON CONFLICT (product_id) DO UPDATE SET ...的写法 - 如果dtb_ranking还有其他需要同步的字段,直接在
INSERT字段列表和UPDATE部分添加对应的字段即可 - 可以根据业务需求,给存储过程加日志输出或者异常捕获逻辑,比如用
DECLARE HANDLER处理执行过程中的错误
内容的提问来源于stack exchange,提问作者user27240
相关产品推荐
相关产品推荐

