遇到一个业务场景,数据库不存在这条数据则插入,有这条数据则更新,但是更新需要id条件相等,在on duplicate key update中并不能直接写入where条件。
数据库采用唯一id字段做主键,在on duplicate key update时插入得判断id存不存在。
最后采用WHEN+IF形式
INSERT INTO `example_table` (
<if test='id != null'>id,</if>
field1, field2, field3, field4, field5,
field6, field7, field8, field9, field10,
field11, field12, field13, field14, field15
) VALUES (
<if test='id != null'>#{id},</if>
#{field1}, #{field2}, #{field3}, #{field4}, #{field5},
#{field6}, #{field7}, #{field8}, #{field9}, #{field10},
#{field11}, #{field12}, #{field13}, #{field14}, #{field15}
)
<if test='id != null'>
ON DUPLICATE KEY UPDATE
field1 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field1) ELSE field1 END,
field2 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field2) ELSE field2 END,
field3 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field3) ELSE field3 END,
field4 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field4) ELSE field4 END,
field5 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field5) ELSE field5 END,
field6 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field6) ELSE field6 END,
field7 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field7) ELSE field7 END,
field8 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field8) ELSE field8 END,
field9 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field9) ELSE field9 END,
field10 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field10) ELSE field10 END,
field11 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field11) ELSE field11 END,
field12 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field12) ELSE field12 END,
field13 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field13) ELSE field13 END,
field14 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field14) ELSE field14 END,
field15 = CASE WHEN VALUES(id) = #{id} THEN VALUES(field15) ELSE field15 END
</if>;