mysql数据插入时,数据不存在则插入,存在则更新或忽略

背景: 在数据库操作中,有这样一个场景:我们对一批数据进行存储,假如这批数据中有部分数据是重复的,可能是全部重复也可能是部分重复,存储的时候我们要把重复的数据合并或者跳过。

实例:

create table store(
ID  int(8) auto_increment primary key,
store_name varchar(255),
store_href varchar(255) unique,
credit_count int(4),
albums_url varchar(120),
phone varchar(40),
address varchar(255),
product varchar(255),
);

表结构如下:
在这里插入图片描述

解决方法:

前提: 在实现之前,必须要注意一个点,就是先找到实例表中的你自己认为能唯一区分所有数据的一个字段,并给他设置唯一索引unique,且不能是ID因为ID设置了就没有意义了,也可以是主键看情况。唯一索引的作用是被设置的字段对应的列之后的数据都不能出现重复。像我上面的商店表中的store_href字段,因为网上的商店连接都只有一个连接地址,而其他的可能被多个商店使用

一、 存在就更新

on duplicate key update:

插入数据的索引unique或者primary key发生冲突,则会执行更新操作。假如store数据表中已经有了实例表中,假如没有的话就把前面的数据插入实例表。如下面的语句:

insert into store (store_name,store_href,credit_count,albums_url,phone,address,product) values ("三只松鼠","http://x.yupoo.com/photos/?k=三只松鼠","4星","http://x.yupoo.com/photos/2986934341/albums/11531437?uid=1","10086","火星","零食") on duplicate key update store_name="三只松鼠",store_href="http://x.yupoo.com/photos/?k=三只松鼠",credit_count="5星",albums_url="http://www.baidu.com",phone="10000",address="火星",product="零食";

语法:

insert into 表名 (字段1,字段2,字段3 ...) values (1,2,3 ...)  on duplicate key update store_name 值1="新值1",2="新值2",3="新值3" ...;

执行的结果是:如果插入数据的时候没有冲突,说明数据库中没有这条数据,则一条结果受到影响;如果插入数据的时候发生了冲突,说明数据库中有这条数据,则两条数据受到影响。这里的ID不会发生改变,因为他是执行的更新。

replace into:

replace into 和 on duplicate key update 唯一的区别是,replace into 他不是更新冲突的那条数据,而是删除后再插入:如下面的语句:

replace into store (store_name,store_href,credit_count,albums_url,phone,address,product) values ("三只松鼠","http://x.yupoo.com/photos/?k=三只松鼠","5星","http://www.baidu.com","10000","火星","零食");

语法:

replace into 表名 (字段1,字段2,字段3 ... ) values ("值1","值2","值3" ... );

执行的结果:如果插入数据的时候没有冲突,说明数据库中没有这条数据,则一条结果受到影响;如果插入数据的时候发生了冲突,说明数据库中有这条数据,则两条数据受到影响。这里的ID会发生改变,因为他是先执行删除后执行插入。

二、存在就忽略

insert ignore into:

插入数据的索引unique或者primary key发生冲突,则会忽略此次操作。如下面的语句:

insert ignore into store (store_name,store_href,credit_count,albums_url,phone,address,product) values ("三只松鼠","http://x.yupoo.com/photos/?k=三只松鼠","5星","http://www.baidu.com","10000","火星","零食");

语法:

insert ignore into 表名 (字段1,字段2,字段3 ... ) values ("值1","值2","值3" ... );

执行的结果:如果插入数据的时候没有冲突,说明数据库中没有这条数据,则一条结果受到影响;如果插入数据的时候发生了冲突,说明数据库中有这条数据,则零条数据受到影响。这里的表数据不会发生改变。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值