Mybatis on duplicate key update 理解及使用

1.新建表结构

create table user(
id int(11) not null auto_increment primary key,
name varchar(64) default null,
password varchar(64) default null,
classid int(11) not null,
courseid int(11) not null
)

2. 添加唯一联合索引

create unique index idx_classid_courseid on user(classid, courseid);

3. 使用 向表中新增一条数据,由于表中现在一条数据也没有,所以不包含 classid-courseid 组成的联合索引 1-1,所以会直接插入,on duplicate key update 后的更新并不会执行

insert into user(name, password, classid, courseid)
values (zhangsan, zhangsan, 1, 1)
on duplicate key update name = values(name), password = values(password)

执行结果如下: 修改插入值后,再次执行,如下,由于表中已经包含 classid-courseid 组成的联合索引 1-1,所以不会插入,而是会执行 on duplicate key update 后的更新语句,即更新 name 和 password

insert into user(name, password, classid, courseid)
values (lisi, lisi, 1, 1)
on duplicate key update name = values(name), password = values(password)

执行结果如下: 4. 结论

当使用 insert into table … select … 方式进行插入时,如果新插入的数据组成的联合唯一索引在表中已经存在,那么便会执行更新操作(更新的字段名称则是 on duplicate key update 后的字段),否则就进行新数据的插入。

5. 特别注意 联合索引中不能存在 null 值,否则每次都会进行插入操作!!!

经验分享 程序员 微信小程序 职场和发展