项目场景:
例如:项目场景:项目使用了sharding分库分表,有不存在则保存,存在则更新的操作需求,所以使用了on duplicate key update
,但是无效,报错了。用的mybatis-plus。on duplicate key update
的使用看另外一篇文章mysql实现存在则保存,不存在则更新
首先说明:
- sharding分片字段不能更新
- 执行insert操作的时候,分片字段不能为空,否则会给每个分表都插入同一条数据
问题描述
使用了shardingsphere-jdbc分表,同时使用了on duplicate key update
更新保存数据,但是使用了on duplicate key update
报错了,主要是说sql 的替换符号?没有传参。具体报错信息我忘了,前段时间遇到的问题,现在才有时间总结。
错误做法:
<insert id="insertOrUpdateBatchOrderItem"> INSERT INTO order_item_info ( vender_id, order_id, pin ) values <foreach collection="itemInfoDOList" item="item" separator=","> ( #{item.venderId}, #{item.orderId}, #{item.pin} ) </foreach> ON DUPLICATE KEY UPDATE sku_id = #(item.sku_id), outer_sku_id = #(item.outer_sku_id), update_time= NOW() </insert>
原因分析:
起初我用的这种方式 ON DUPLICATE KEY UPDATE sku_id = #(item.sku_id)
, update后面接的是换位符#{},但是sharding这个语句后面不支持传递参数,所以这种方式不行。
解决方案:
提示:用
value()
替代#{}
value()
会引用前面 的#{}值,所以不需要另外传递参数
<insert id="insertOrUpdateBatchOrderItem"> INSERT INTO order_item_info ( vender_id, order_id, pin, sku_id, outer_sku_id, sku_name, jd_price, gift_point, ware_id, item_total, product_no, service_name, new_store_id, item_ext ) values <foreach collection="itemInfoDOList" item="item" separator=","> ( #{item.venderId}, #{item.orderId}, #{item.pin}, #{item.skuId}, #{item.outerSkuId}, #{item.skuName}, #{item.jdPrice}, #{item.giftPoint}, #{item.wareId}, #{item.itemTotal}, #{item.productNo}, #{item.serviceName}, #{item.newStoreId}, #{item.itemExt} ) </foreach> ON DUPLICATE KEY UPDATE sku_id = VALUES(sku_id), outer_sku_id = VALUES(outer_sku_id), sku_name = VALUES(sku_name), jd_price = VALUES(jd_price), gift_point = VALUES(gift_point), ware_id = VALUES(ware_id), item_total = VALUES(item_total), product_no = VALUES(product_no), service_name = VALUES(service_name), new_store_id = VALUES(new_store_id), item_ext = VALUES(item_ext), update_time= NOW() </insert>
来源地址:https://blog.csdn.net/qq_45807943/article/details/130432654