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 值,否则每次都会进行插入操作!!!
