mysql中duplicate key update

  • Post author:
  • Post category:mysql




二、duplicate key update

duplicate key update (重复密钥更新)

插入字段时如何自我判断是更新还是插入



2.1基础用法



2.1.1 假设此时我们表中没有数据

执行语句

INSERT INTO test ( id, NAME )
VALUES
	( '1', '晓明' ) 
ON DUPLICATE KEY UPDATE
id='123',
name='xiaoming'

结果

请添加图片描述



2.1.2 有数据后再次执行

执行语句

同上

sql结果

请添加图片描述


这里就是关键:我们可以看到变动为2,此时就是说明原数据进行了更新,更新内容为下面设置的字段值

结果

请添加图片描述


Q:我们再次执行一次这个语句,结果是什么样子呢?

A:自然是判断出该表中无此数据,新增一条额外的新数据

sql结果

请添加图片描述

结果

请添加图片描述

小结


到这里大家肯定明白了,其实就是会自动检测是否存在,如果存在values后面的值就会自动更改,不存在则插入



2.3 拓展用法,批量插入

执行语句

INSERT INTO test(`id`,`name`,`address`)
VALUES('4','修改10','北京'),
	( '1', '晓明' ,1) 
ON DUPLICATE KEY UPDATE
name=VALUES(name),address=VALUES(address);

结果

请添加图片描述

批量自动判断是否存在,存在则自动修改



2.4 Mybatis中的写法

单独插入

<insert id="insertUser" parameterType="com.test.User">
    INSERT INTO user(
    id,
    name,
    gender,
    birthday,
    address)
    VALUES
    (#{id},
    #{name},
    #{gender},
    #{birthday},
    #{address})
    ON DUPLICATE KEY UPDATE
    id = VALUES(id),
    name = VALUES(name),
    gender = VALUES(gender)
    birthday = VALUES(birthday),
    address = VALUES(address)
</insert>

批量插入

<insert id="insertUser" parameterType="java.util.List">
    INSERT INTO user(
    id,
    name,
    gender,
    birthday,
    address)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},
        #{item.name},
        #{item.gender},
        #{item.birthday},
        #{item.address})
    </foreach>
    ON DUPLICATE KEY UPDATE
    id = VALUES(id),
    name = VALUES(name),
    gender = VALUES(gender)
    birthday = VALUES(birthday),
    address = VALUES(address)
</insert>



版权声明:本文为qq_42331108原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。