SQL实现新行插入,旧行更新/判断重复数据则不插入/insert ignore、insert和replace的使用

mysql中如何判断指定字段的重复数据则不插入?

以下是几种具体方法。
方法一:sql拼接进行解决,复杂麻烦。
insert into 表名(待插入字段1,待插入字段2,…,待插入字段n)
select
‘张三’,‘1’,…,‘袜子’
from 表名 a
where not exists(select 1 from 表名 b where b.判断条件字段1=‘张三’ and b.判断条件字段2=‘1’ and 判断条件字段n=‘23531172612’)
方法2:使用INSERT INTO… ON DUPLICATE KEY UPDATE 建议使用
链接:http://blog.zol.com.cn/2299/article_2298921.html
http://blog.lyphp.com/archives/527
方法3:使用复合主键,多个判断条件字段组合成一个复合主键
链接:http://www.jb51.net/article/21382.htm
方法4:建唯一索引 用ignore into插入数据 建议使用
方法5:使用存储过程,不知道mysql是否适用?
链接 http://bbs.csdn.net/topics/390316341

扩展讨论:
当数据达到上百万条的时候,以上几种方法,哪个方法的性能最佳?

mysql中如何判断指定字段的重复数据则更新,否则插入?

两种方式,replace into 与 insert into on duplicate key update 机制。

insert ignore、insert和replace区别

insert:插入已存在, id会自增,但是插入不成功,会报错
replace:已存在替换,删除原来的记录,添加新的记录,不存在替换,添加新的记录
insert ignore:插入已存在,忽略新插入的记录,id会自增,不会报错,插入不存在,添加新的记录

指令已存在不存在举例
insert报错插入insert into names(name, age) values(“小明”, 23);
insert ignore忽略插入insert ignore into names(name, age) values(“小明”, 24);
replace替换插入replace into names(name, age) values(“小明”, 25);

表要求:有PrimaryKey,或者unique索引,因为报错情况是针对于有约束的情况的,这个约束可以是主键,也可以是索引,例如我在使用的时候是使用了多列索引。
结果:注意如果是自增ID,表ID都会自增,这里解释为什么会自增,因为都是将原先的行删除,新增加了一行新值。

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

replace into和insert into on duplicate key update都是为了解决我们平时的一个问题,就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录。
replace into如果已存在记录,影响行数为2,为什么会出现这种情况,原因就是replace into会首先尝试先往表里面插入记录,因为我们的ID是主键,不可重复,显然这条记录是无法插入成功的,然后replace into会把这条已存在的记录删掉,然后再插入,所以会显示影响行数是2。而且注意,原有字段的值就已经没有了,显然如果insert into on duplicate key update语句仅仅只是在原记录基础上进行更新操作的话,自增字段是不会自动加1的,说明它也进行了记录删除操作。
insert into on duplicate key update的话,先插入记录,如果不成功,则删除原记录,但保留了除update语句后字段的值,然后把保留的值与需要更新的值合并,然后插入一条新记录。
总结:
replace into 与 insert into on duplicate key update都是先尝试插入记录,如果不成功,则删除记录,replace into不保留原记录的值,而insert into on duplicate key update保留。然后插入一条新记录。

参考:
mysql:insert ignore、insert和replace区别
mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点
mysql中如何判断指定字段的重复数据则不插入?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值