MySQL中的insert ignore into
最近工作中,使用到了insert ignore into语法,感觉这个语法还是挺有用的,这里做个记录。
insert ignore into : 忽略重复的记录,直接插入数据。
1、插入的数据是主键冲突时,insert ignore into会给出“warnings”,并且本次插入无效
2、没有主键冲突时,直接插入数据
对于一些简单的避免主键重复插入,不需要返回错误的需求还是非常好用的。
当前表结构:
在mybatis中的使用:
<insert id="insertIgnoreStudyUserComplete">
insert IGNORE into gnfl_study_user_complete(user_id,study_id,create_time) values(#{userId},#{studyId},SYSDATE())
</insert>
最后提一点注意点(坑):避免自增id和复杂的组合unique key
insert ignore的时候会对插入的每一行数据取S锁做unique id的检测,同时会对主键的自增id字段加写意向锁(insert intension),在unique key较为复杂的时候,检测unique key的时候会一直占用主键的插入意向锁,其他insert ignore也想给主键id加插入意向锁,导致死锁。