介紹:
在MySQL數據庫中,如果在insert語句後面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新;如果插入的行數據與現有表中記錄的唯一索引或者主鍵不重複,則執行新紀錄插入操作。
說通俗點就是數據庫中存在某個記錄時,執行這個語句會更新,而不存在這條記錄時,就會插入。
用法:
insert into tablename(field1,field2,field3,......)
values
(value1,value2,value3,....)
on duplicate key update
field1=values(value1),field2=values(value2),field3=values(value3),......;
實際操作
表(這裏id用的是自增):
新增操作
原先記錄:
SQL:
insert into cmdb_device_resources( ID,NODE,project_batch_id,IDC,DEVICECLASS1ID,DEVICECLASS2ID,DEVICECONFIGID,
PLANNING_RESOURCES,BUILDING_RESOURCES,REMARK,CREATE_DATE)
VALUES(null,'all',null,'all','','','',8,4,'備註',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)
插入後記錄:
修改操作:
原先記錄(就是上圖插入後記錄,這裏不插入圖片)
SQL:區別在於id(索引)
insert into cmdb_device_resources( ID,NODE,project_batch_id,IDC,DEVICECLASS1ID,DEVICECLASS2ID,DEVICECONFIGID,
PLANNING_RESOURCES,BUILDING_RESOURCES,REMARK,CREATE_DATE)
VALUES(4,'all',null,'all','','','',10,5,'備註',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)
修改後記錄:
在mybatis中的使用:
單個增加或修改sql的寫法爲:
<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>
在mybatis中進行批量增加或修改的sql爲:
<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>
參考:
https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
https://www.jianshu.com/p/78ea17c6d190