背景:
项目使用shardingSphere进行脱敏加密,原有sql使用 ON DUPLICATE KEY UPDATE(插入记录,若存在即更新),sql异常。具体sql如下:
1.原sql(异常):
insert into t_user(
user_name,
user_id,
user_address,
create_time
) values(
#{userName},
#{userId},
#{ userAddress},
now()
) ON DUPLICATE KEY UPDATE(
user_address = #{userName},
update_time = now()
)
2.修改后sql:
insert into t_user(
user_name,
user_id,
user_address,
create_time
) values(
#{userName},
#{userId},
#{ userAddress},
now()
) ON DUPLICATE KEY UPDATE(
user_address = values(user_address),
update_time = now()
)
3.小结
在 ON DUPLICATE KEY UPDATE语句中不能使用#{},${}, 需要使用VALUES方法。
具体的逻辑是,先会执行插入的逻辑,当主键冲突时才会执行 ON DUPLICATE KEY UPDATE后面的更新语句,而在执行ON DUPLICATE KEY UPDATE之前,具体的值已经在插入之前解析好了,所以通过values直接取对应的字段值即可。