其实原本不想起一个篇幅聊这个话题的,但是小马多次尝试了在之前的文章下评论下面的语句,都是提示发布评论成功,然后被秒删。在想是不是因为有SQL特殊字符被系统处理了。无奈之下只好起一个篇幅记录。INSERT INTO ON DUPLICATE KEY UPDATE
发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。
语法如下(但不是本次文章的重点):insert into score(idnum, birthday, score) values(350302,'2021-01-16',30) ON DUPLICATE KEY UPDATE score=score+5;
//此时,idnum省份证为主键,则如果已经存在350302,'2021-01-16',30或者350302,'...',00这条数据,则30会被更新为35。即350302,'2021-01-16',35
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!
这个东西非常好用,在某种程度上用一句话解决了本来需要两个语SQL语句(一个查一个写)带来的并发和事务问题。美酒虽好可不要贪杯,这个使用要非常小心,语句是基于主键或者唯一键判断是否有重复的。总结:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。
下面来几个真实案例来说明这一块。
1.比如主键是phoneNum,数据137,aa,138 bb;此时要插入137, cc 则是执行更新操作。
2.如果在此基础上增加一个id为主键自增,phoneNum为唯一键,数据据1 137,aa ,2 138 bb;此时要插入138, cc 则是执行更新操作,虽然id和phoneNum都是唯一键,只要有一个字段有重复值则认为要更新!!
3.如果主键是id为主键自增, 唯一键为phoneNum和姓名的组合键,数据137,aa,138 bb;此时要插入137, cc 则是当做新数据insert操作,不是执行更新操作!!
还有一个问题必须说明:
这个语句会导致ID的自增不连续,原因是,如果数据库主键设置了自增,那么在使用这个语法时,即时没有执行insert操作,AUTO_INCREMENT也会进行加1的操作。
也就是执行了ON DUPLICATE KEY UPDATE 时也算默认加1,下一次执行insert则是累加的,就会有可能出现自增ID为1,3,4,7这样的情况。
彩蛋时间:
1.你的表结构不论怎么样,最好设置一个主键,注意这里说的是主键而不是唯一键,仅仅只有唯一键也是不被建议的。
2.解决emoji表情字符或者昵称特殊字符无法入库的方式有这些:将Mysql的编码从utf8转换成utf8mb4;过滤解决;转义解决;转UTF8后urlencode编码后入库(虽然表情会丢失,如不转UTF8的话GBK编码后前段无法decodeURIComponent出来)