You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多表存在则更新不存在则插入的实现方案咨询

解决多表关联下的更新与插入(Upsert)问题

核心思路

MySQL的INSERT ... ON DUPLICATE KEY UPDATE仅支持单表操作,因此我们可以将**更新t_goods和t_prices的Upsert(存在则更新,不存在则插入)**拆分为两个独立操作,并用事务保证两个操作的原子性(要么同时成功,要么同时回滚)。

前提条件

必须确保t_prices表的goods_id字段存在唯一约束(主键或唯一索引),否则INSERT ... ON DUPLICATE KEY UPDATE无法触发更新逻辑,会直接插入重复记录。

具体实现代码

START TRANSACTION;

-- 第一步:更新t_goods的description字段
UPDATE `t_goods`
INNER JOIN (
    SELECT 'bla-bla-bla' AS description, '123456' AS id, 1000 AS price
) AS DataToUpdateTable
ON t_goods.id = DataToUpdateTable.id
SET t_goods.description = DataToUpdateTable.description;

-- 第二步:对t_prices执行Upsert操作
INSERT INTO `t_prices` (goods_id, price)
SELECT id, price FROM (
    SELECT '123456' AS id, 1000 AS price
) AS DataToUpdateTable
ON DUPLICATE KEY UPDATE price = VALUES(price);

COMMIT;

原方案问题说明

你之前用LEFT JOIN关联t_prices的写法,当t_prices中无对应记录时,t_prices的所有字段值为NULL,此时SET t_prices.price = ...的更新逻辑不会生效(因为没有实际的行可以更新)。拆分操作后,INSERT ... ON DUPLICATE KEY UPDATE会自动判断:如果t_prices中已存在对应goods_id的记录,则更新price;如果不存在,则插入一条新记录。

内容的提问来源于stack exchange,提问作者Sergey Salikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:55