mysql 数据不存在则插入,存在则更新
mysql 数据不存在则插入,存在则更新,可以用 INSERT ON DUPLICATE KEY UPDATE实现。
INSERT ON DUPLICATE KEY UPDATE 不可以和WHERE一起使用,
使用INSERT ON DUPLICATE KEY UPDATE ,需要先创建唯一索引。
当数据表中,不存在唯一索引的字段与要插入数据相同的值时,就会插入INSERT INTO的数据,否则就更新 ON DUPLICATE KEY UPDATE 后面的语句。
不存在则插入,存在则更新
(1) -- 创建唯一索引
格式:
ALTER TABLE 表名 ADD UNIQUE KEY `uk_唯一索引名` (`字段名`,`字段名`...);
示例:
ALTER TABLE t_person ADD UNIQUE KEY `uk_user_id_type` (`user_id`,`type`);
t_person 是表名,uk_user_id_type 是唯一索引,由user_id
,type
构成。
注意,创建唯一索引时,要确保数据表中没有重复的值。比如创建唯一索引(A,B),如果数据表中存在多条相同的A和B,就需要先把重复的数据清理掉,再创建唯一索引。
如果数据表里面已经有主键id了,也可以直接把这个主键id当唯一索引用。表示主键id不存在就插入对应的数据,存在就更新。
(2) -- 不存在则插入,存在则更新
INSERT INTO t_person (name, user_id, type, auth_state, update_date)
VALUES('lin',12345 , 123 , 1, now())
ON DUPLICATE KEY UPDATE auth_state = VALUES(`auth_state`)
由于 t_person 创建了唯一索引 uk_user_id_type
(user_id
,type
),
上面这段sql表示,如果数据表中不存在数据(user_id
,type
)值为 (12345 , 123)时,就会插入。
如果存在,就会执行 ON DUPLICATE KEY UPDATE 后面的语句。也就是将此条数据的auth_state 更新为 auth_state=1。
批量插入/更新
INSERT ON DUPLICATE KEY UPDATE,还支持 批量插入/更新。
对应的mybatis代码如下:
<insert id="batchInsertOnDuplicate" parameterType="com.domain.test.Person" >
insert into t_person (name, user_id, type, auth_state, update_date)
values
<foreach collection="list" separator="," item="item" >
(#{item.name,jdbcType=VARCHAR},
#{item.userId,jdbcType=INT},
#{item.type,jdbcType=INT},
#{item.authState,jdbcType=INT},
#{item.updateDate,jdbcType=DATE}
)
</foreach>
ON DUPLICATE KEY UPDATE `auth_state` = VALUES(`auth_state`)
</insert>