(Oracle merge into语法修改为MySQL语法解决方案)
在MySQL中得使用“on duplicate key update”来实现判断新增还是更新操作。
但是这里有一个大坑,就是MySQL没有判断更新还是新增的条件。
这也不怪MySQL的设计,因为不难想出,要按照条件满足进行更新,条件不满足进行新增的业务逻辑,数据库中应该满足条件的数据只有一条。想通这一点。就知道有解决方案了。
MySQL是将需要判断的业务字段设置为联合唯一约束来配合“on duplicate key update”语法实现。
意思就是严格认为数据库只有一条或者零条符合约束条件(判断更新或新增条件)的数据。如果数据库有多条数据需要更新的话,MySQL就不支持直接修改SQL层面了,这里就得拆分原先的Oracle语法
先查询满足条件的条数是否大于0
大于0执行按条件更新操作
不大于0执行按条件新增操作
MySQL增加联合唯一约束
ALTER TABLE TABLE_NAME(表名) ADD UNIQUE KEY (字段A, 字段B,···);
-- Oracle merge into 语法
merge into table
using (schema. table | views | query) -- 这里边可以传参数
on (判断条件) -- 用于判断是更新还是新增的条件
when matched then
update set --满足条件更新操作
when not matched then
insert() -- 不满足条件、插入操作
values()
-- 例子
merge into TABLE_NAME t_name
using (select #{type} type, #{batchNo} batchNo from dual) t
on (t_name.type= t.type and t_name.BATCH_NO = t.batchNo)
when matched then
update set t_name.status = #{status,jdbcType=VARCHAR}
when not matched then
insert(PK_ID,status )
values('11111',#{status,jdbcType=VARCHAR})
-- MySQL语法(需要(判断条件)创建唯一约束后方可使用)
insert into TABLE_NAME
(PK_ID,status )
values
('11111',#{status,jdbcType=VARCHAR})
on duplicate key update
status = #{status,jdbcType=VARCHAR}
应该可以解决你的问题了,解决问题了点个赞。
没解决哪里有问题呢?加微信注明来意,我帮你看看。