Mysql中Insert into xxx on duplicate key update问题

一,on duplicate key update

在看代码的过程中碰到了这一用法,不太理解,google了一下。它的意义其实是如果在insert语句末尾制定了on duplicate key update语句的话,则当插入行会导致一个unique索引或者primary key中出现重复值,则执行update中的语句,否则才插入新行;

create table `goods`(

    `id` int(10) null auto_increment,

    `name` char(50) null,

    `click` int(10) null,

    primary key(`id`)

) engine = InnoDB;

insert into goods(name, click)values('admin', '10'), ('kuyu', '11');

insert into goods(id, name, click)values(2, 'admin', '10') ON  DUPLICATE KEY UPDATE click=click+10;

注意,要使用这条语句,前提条件是这个表必须有一个唯一索引或主键。

总结如下:

1.如果表中不存在主键记录,replace和insert*update都与insert是一样的特点。

2.如 果表中存在主键记录,replace相当于执行delete 和 insert两条操作,而insert*update的相当于执行if exist do update else do insert操作。因此,如果replace填充的字段不全,则会导致未被更新的字段都会修改为默认值,并且如果有自增id的话,自增id会变化为最新的 值(这样如果是以自增id为标志的话可能导致记录丢失);而insert*update只是更新部分字段,对于未被更新的字段不会变化(不会强制修改为默 认值)。

insert into goods(id, name, click)values(2, 'admin1', '11'), (2, 'admin2', '12') ON DUPLICATE KEY UPDATE click=values(click);

二,REPLACE 函数:

我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。

REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。

插入一条数据:replace into goods(id, name, click)values(2, 'admin12', '1000');

批量插入数据:replace into goods(id, name, click)values(2, 'admin12', '10000'),(1, 'admin12', '10000');

这也是

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 832评论 1 0
  • 1、MySQL启动和关闭(安装及配置请参照百度经验,这里不再记录。MySQL默认端口号:3306;默认数据类型格式...
    强壮de西兰花阅读 679评论 0 1
  • 亲爱的友友们,大家周末好,每到周末,上午的微信朋友圈除了问候早安,是没有内容的,是不是感觉到和平时不一样啊,...
    暖洋洋说生活阅读 770评论 0 1
  • 在一个手机软件上,我无意间听到了林清玄的文章,当时的第一感是朴素、柔和,没有华丽的辞藻与冠冕堂皇的修饰,让人读了心...
    蒹葭飞絮阅读 958评论 0 1
  • 午后的你悄悄的染上了浅红 是秋的味 午后的桥东 但凉凉的藏着暗色的空洞 午后的你蔚蓝明亮 是风抚动的脸 金灿灿现出...
    晴天映白云阅读 81评论 0 2