文艺的PHP

Mysql中Insert into xxx on duplica

2017-11-19  本文已影响76人  君满楼001

一,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');

这也是

上一篇 下一篇

猜你喜欢

热点阅读