项目场景:
例如:项目场景:项目使用了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>