on duplicate key update的用法

介紹:

在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

https://blog.csdn.net/qq_22771739/article/details/84668620

https://www.cnblogs.com/zjdxr-up/p/8319982.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章