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