欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql插入前判断数据是否存在的操作

程序员文章站 2022-06-27 10:31:27
业务场景:需要记入访客的访问情况,但不能重复记入可以插入前进行判断要插入的数据是否存在业务代码如下 :insert into t_topic_vistor(user_id,topic_code) se...

业务场景:需要记入访客的访问情况,但不能重复记入

可以插入前进行判断要插入的数据是否存在业务代码如下 :

insert into t_topic_vistor(user_id,topic_code) select '218', 
'xq33019920170811142528217' from dual where not exists(select * 
from t_topic_vistor where user_id = 218 and 
topic_code='xq33019920170811142528217')

语法如下:

insert into table(field1, field2, fieldn) select 'field1', 
'field2', 'fieldn' from dual where not exists(select field from 
table where field = ?)

补充知识:mysql 不存在则插入,存在则更新或忽略

前言

在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 sql 语句来处理(如果仅仅知道一些简单的 sql 语法的话),当然也可以使用一些简单的 sql 语法,不过它并不是通用所有的数据库类型。

以下所有实例仅针对mysql而言,并不能随意用于其它数据库

实例

表名称:student

表字段:

column name primary key auto increment unique
id true true
name true
age

初始表数据:

id name age
1 jack 18

注:以下所有的示例都需要被插入的数据中需要存在unique索引或primary key字段,同时这里引入表的主键id,并设置成自动递增,后面可以看到它的变化

1. 不存在则插入,存在则更新

1.1 on duplicate key update

如果插入的数据会导致unique 索引或primary key发生冲突/重复,则执行update语句,例:

insert into `student`(`name`, `age`) values('jack', 19)
 on duplicate key 
 update `age`=19; -- if will happen conflict, the update statement is executed

-- 2 row(s) affected

这里受影响的行数是2,因为数据库中存在name='jack'的数据,如果不存在此条数据,则受影响的行数为1

最新的表数据如下:

id name age
1 jack 19

1.2 replace into

如果插入的数据会导致unique 索引或primary key发生冲突/重复,则先删除旧数据再插入最新的数据,例:

replace into `student`(`name`, `age`) values('jack', 18);

-- 2 row(s) affected

这里受影响的行数是2,因为数据库中存在name='jack'的数据,并且id的值会变成2,因为它是先删除旧数据,然后再插入数据,最新的表数据如下:

id name age
2 jack 19

2. 避免重复插入

关键字/句:insert ignore into,如果插入的数据会导致unique索引或primary key发生冲突/重复,则忽略此次操作/不插入数据,例:

insert ignore into `student`(`name`, `age`) values('jack', 18);

-- 0 row(s) affected

这里已经存在name='jack'的数据,所以会忽略掉新插入的数据,受影响行数为0,表数据不变。

以上这篇mysql插入前判断数据是否存在的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。