mysql插入前判断数据是否存在的操作
业务场景:需要记入访客的访问情况,但不能重复记入
可以插入前进行判断要插入的数据是否存在业务代码如下:
INSERTINTOt_topic_vistor(user_id,topic_code)SELECT'218', 'XQ33019920170811142528217'FROMDUALWHERENOTEXISTS(SELECT* FROMt_topic_vistorWHEREuser_id=218and topic_code='XQ33019920170811142528217')
语法如下:
INSERTINTOtable(field1,field2,fieldn)SELECT'field1', 'field2','fieldn'FROMDUALWHERENOTEXISTS(SELECTfieldFROM tableWHEREfield=?)
补充知识:MySql不存在则插入,存在则更新或忽略
前言
在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的SQL语句来处理(如果仅仅知道一些简单的SQL语法的话),当然也可以使用一些简单的SQL语法,不过它并不是通用所有的数据库类型。
以下所有实例仅针对MySQL而言,并不能随意用于其它数据库
实例
表名称:student
表字段:
ColumnName | PrimaryKey | AutoIncrement | Unique |
---|---|---|---|
id | true | true | |
name | true | ||
age |
初始表数据:
id | name | age |
---|---|---|
1 | Jack | 18 |
注:以下所有的示例都需要被插入的数据中需要存在UNIQUE索引或PRIMARYKEY字段,同时这里引入表的主键id,并设置成自动递增,后面可以看到它的变化
1.不存在则插入,存在则更新
1.1onduplicatekeyupdate
如果插入的数据会导致UNIQUE索引或PRIMARYKEY发生冲突/重复,则执行UPDATE语句,例:
INSERTINTO`student`(`name`,`age`)VALUES('Jack',19) ONDUPLICATEKEY UPDATE`age`=19;--Ifwillhappenconflict,theupdatestatementisexecuted --2row(s)affected
这里受影响的行数是2,因为数据库中存在name='Jack'的数据,如果不存在此条数据,则受影响的行数为1
最新的表数据如下:
id | name | age |
---|---|---|
1 | Jack | 19 |
1.2replaceinto
如果插入的数据会导致UNIQUE索引或PRIMARYKEY发生冲突/重复,则先删除旧数据再插入最新的数据,例:
REPLACEINTO`student`(`name`,`age`)VALUES('Jack',18);
--2row(s)affected
这里受影响的行数是2,因为数据库中存在name='Jack'的数据,并且id的值会变成2,因为它是先删除旧数据,然后再插入数据,最新的表数据如下:
id | name | age |
---|---|---|
2 | Jack | 19 |
2.避免重复插入
关键字/句:insertignoreinto,如果插入的数据会导致UNIQUE索引或PRIMARYKEY发生冲突/重复,则忽略此次操作/不插入数据,例:
INSERTIGNOREINTO`student`(`name`,`age`)VALUES('Jack',18);
--0row(s)affected
这里已经存在name='Jack'的数据,所以会忽略掉新插入的数据,受影响行数为0,表数据不变。
以上这篇mysql插入前判断数据是否存在的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。