二、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 版权协议,转载请附上原文出处链接和本声明。