有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是saveOrUpdate操作
当没有的时候就是插入语句
有数据的时候判断主键和唯一索引是否一样,一样那就按照 ON DUPLICATE KEY UPDATE写的修改需要修改端字段值
方法一:采用replace 实现
replace into test (a,b,num) values('a','a',2),('b','b',3),('a','a',10);
但是replace 方法是 根据唯一键值做判断 如果存在 则先删除 再插入
方法二:ON DUPLICATE KEY UPDATE
// 有这个时间的数据就count+1,否则直接创建当前时间,count为1的数据
insert into zycxScanCount(create_time,count)
VALUES(#{createTime}, 1)
ON DUPLICATE KEY UPDATE count=count+1;
2.1介绍:
此条sql 前半部分和 批量insert 相同
on duplicate key 关键字 标识 如果该表中有UNIQUE索引或PRIMARY KEY 主键 重复的情况下 导致插入失败 会自动执行update方法 更新的字段和值 在末尾追加
ps:如需 更新值写死 也可以写成 num = num + 1
或者 直接更新为带插入数据的 num值 num = values(num)
2.2 注意:
1:ON DUPLICATE KEY UPDATE需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。
2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。
通常的,在ON DUPLICATE KEY UPDATE语句中,我们应该避免多个唯一索引的情况。如果需要插入或更新多条数据,并且更新的字段需要根据其它字段来运算时,可以使用如下语句:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
在ON DUPLICATE KEY UPDATE后面使用VALUES()方法,这个语句等同于下面的两个语句:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;--1+2
INSERT INTO table (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;--4+5
<insert id="saveOrUpdatePlanReportList" parameterType="java.util.List">
insert into cmdb_device_resources
( ID,NODE,project_batch_id,IDC,
DEVICECLASS1ID,DEVICECLASS2ID,DEVICECONFIGID,
PLANNING_RESOURCES,BUILDING_RESOURCES,REMARK,CREATE_DATE)
VALUES(
#{item.cdrId},#{item.node},#{item.project},#{item.idc},
#{item.deviceClass1Id},#{item.deviceClass2Id},#{item.deviceConfigId},
#{item.planningResources},#{item.buildingResources},#{item.remark},now()
)
ON DUPLICATE KEY UPDATE
ID = VALUES(ID),
NODE = VALUES(NODE),
project_batch_id = VALUES(project_batch_id),
IDC = VALUES(IDC),
DEVICECLASS1ID = VALUES(DEVICECLASS1ID),
DEVICECLASS2ID = VALUES(DEVICECLASS2ID),
DEVICECONFIGID = VALUES(DEVICECONFIGID),
PLANNING_RESOURCES = VALUES(PLANNING_RESOURCES),
BUILDING_RESOURCES = VALUES(BUILDING_RESOURCES),
REMARK = VALUES(REMARK),
CREATE_DATE = VALUES(CREATE_DATE)
<insert id="saveOrUpdatePlanReportList" parameterType="java.util.List">
insert into cmdb_device_resources
( ID,NODE,project_batch_id,IDC,
DEVICECLASS1ID,DEVICECLASS2ID,DEVICECONFIGID,
PLANNING_RESOURCES,BUILDING_RESOURCES,REMARK,CREATE_DATE)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.cdrId},#{item.node},#{item.project},#{item.idc},
#{item.deviceClass1Id},#{item.deviceClass2Id},#{item.deviceConfigId},
#{item.planningResources},#{item.buildingResources},#{item.remark},now()
)
</foreach>
ON DUPLICATE KEY UPDATE
ID = VALUES(ID),
NODE = VALUES(NODE),
project_batch_id = VALUES(project_batch_id),
IDC = VALUES(IDC),
DEVICECLASS1ID = VALUES(DEVICECLASS1ID),
DEVICECLASS2ID = VALUES(DEVICECLASS2ID),
DEVICECONFIGID = VALUES(DEVICECONFIGID),
PLANNING_RESOURCES = VALUES(PLANNING_RESOURCES),
BUILDING_RESOURCES = VALUES(BUILDING_RESOURCES),
REMARK = VALUES(REMARK),
CREATE_DATE = VALUES(CREATE_DATE)
</insert>