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>

posted on 2023-03-15 23:28  乐之者v  阅读(3637)  评论(0编辑  收藏  举报

导航