mysql 添加数据如果数据存在就更新ON DUPLICATE KEY UPDATE和REPLACE INTO
#下面建立game表,设置name值为唯一索引。
CREATE TABLE `game` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 NOT NULL,
`type_id` tinyint(4) NOT NULL DEFAULT '0',
`attr` varchar(20) NOT NULL,
`type_extends` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
对于ON DUPLICATE KEY UPDATE语句:
MySQL手册:如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。
这里的意思是说要设置记录不存在就添加存在就更新,必须在添加这个记录的时候唯一索引和主键发生相同才能触发。
#当我们试图插入一条已经存在的唯一索引name值记录,提示:[Err] 1062 - Duplicate entry '游戏4' for key 'name'
INSERT INTO game SET `name`='游戏4',`type_id`='5',`attr`='无敌游戏',`type_extends`='5'
#下面是使用ON DUPLICATE KEY UPDATE,如果插入记录的时候存在唯一索引和主键重复的记录,那么就执行更新操作
INSERT INTO game SET `name`='游戏4',`type_id`='5',`attr`='无敌游戏',`type_extends`='5'
ON DUPLICATE KEY UPDATE `type_id`='5',`attr`='无敌游戏',`type_extends`='5'
对于使用ON DUPLICATE KEY UPDATE子句如果记录不存在执行添加那么影响行数是一行,如果存在进行更新,如果更新发现没有变化那么影响行数为0,否则影响行数是两行。
对于REPLACE INTO语句
MSQL手册:REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
意思是说,对于REPLACE INTO语句如果发现存在记录那么先将记录删除在插入新记录。
表中原有记录是:
#运行语句:
REPLACE INTO game SET `name`='游戏4',attr='最强的游戏2',type_extends='最强的游戏2_4'
这里的id是设置自动增长主键,这里有两处特别的地方,1是自动增长的id变大了,2是type_id变成0了
在MySQL手册:所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
这里意思是说在REPLACE语句中没有设置的列会被设置成默认值,这里的type_id的默认值是0所以这里被设置成0了,这里也很好理解,因为REPLACE语句是先删除后插入了,而新插入数据如果没有设置值那么就是默认值了。所以下面的语句得到的结果也是不是预期的结果:
#这里的语句得到的结果type_id为1,因为type_id默认值为0。这里的type_id=type_id+1相当于type_id=DEFAULT(type_id) +1
REPLACE INTO game SET `name`='游戏4',type_id=type_id+1,attr='最强的游戏2',type_extends='最强的游戏2_4'
对于REPLACE INTO语句如果记录不存在那么执行添加影响行数为一行,否则执行删除后添加影响行数为两行。
对于存在记录就修改,不存在就添加记录的处理ON DUPLICATE KEY UPDATE和REPLACE INTO语句的区别:
ON DUPLICATE KEY UPDATE语句:是根据主键或者唯一索引判断是否存在记录,如果存在记录那么通过UPDATE子句更新记录内容,只更新UPDATE子句中设置的字段,对于没有设置的字段保持原状,因为是修改语句所以不会对自动增长字段做变化。
语句的返回值有:
0:发现有相同的唯一索引或者主键的记录,执行更新语句,但是更新语句中的字段内容和现有的字段内容一致执行结果没有发生变化;
1:发现没有相同的唯一索引或者主键的记录,直接执行插入语句;
2:发现有相同的唯一索引或者主键的记录,执行更新语句,并且更新语句中的字段内容和现有的字段内容一致执行结果发生变化;
REPLACE INTO语句:是根据主键或者唯一索引判断是否存在记录,如果存在记录那么就删除记录然后将当前语句中的字段内容执行INSERT。因为是删除后再INSERT,所以对自动增长字段做变化。
语句的返回值有:
1:发现没有相同的唯一索引或者主键的记录,直接执行插入语句;
2:发现有相同的唯一索引或者主键的记录,先删除指定语句再进行INSERT语句,这里要注意在执行INSERT的时候如果在REPLACE INTO语句中没有设置的字段那么就会是以默认值填充;
对于ON DUPLICATE KEY UPDATE语句在MySQL手册中有这样一句:
在一个INSERT … ON DUPLICATE KEY UPDATE …语句中,你可以在UPDATE 子句中使用 VALUES(col_name)函数,用来访问来自该语句的INSERT 部分的列值。换言之,UPDATE 子句中的 VALUES(col_name) 访问需要被插入的col_name 的值,并不会发生重复键冲突。
原表中数据:
INSERT INTO game SET `name`='游戏4',`type_id`='4',`attr`='无敌游戏',`type_extends`='无敌游戏_4'
ON DUPLICATE KEY UPDATE `type_extends`=CONCAT(VALUES(attr),'_',VALUES(type_id))
结果数据:
mysql 添加数据如果数据存在就更新ON DUPLICATE KEY UPDATE和REPLACE INTO的更多相关文章
- MySQL插入更新_ON DUPLICATE KEY UPDATE
前提:操作的表具有主键或唯一索引 INSERT INTO:表中不存在对应的记录,则插入:若存在对应的记录,则报错: INSERT INTO IGNORE:表中不存在对应的记录,则插入:若存在对应的记录 ...
- mysql ON DUPLICATE KEY UPDATE、REPLACE INTO
INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?前提条件是这个表必须有一个唯一索引或主键 ...
- mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into
转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用 mysql insert时几个操作DE ...
- mysql 插入更新判断 ON DUPLICATE KEY UPDATE 和 REPLACE INTO
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.此时 插入数据的时候 ,经常会有这样的情况:我们想向数据库插入一条记录: 若数据表中存在以相同主 ...
- mysql:on duplicate key update与replace into
在往表里面插入数据的时候,经常需要:a.先判断数据是否存在于库里面:b.不存在则插入:c.存在则更新 一.replace into 前提:数据库里面必须有主键或唯一索引,不然replace into ...
- MySQL_插入更新 ON DUPLICATE KEY UPDATE
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...
- mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别
#mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...
- MySQL-插入更新 ON DUPLICATE KEY UPDATE
向数据库中插入一条记录,若该数据的主键值(UNIQUE KEY)已经在表中存在,则执行后面的 UPDATE 操作.否则执行前面的 INSERT 操作. 测试表结构 CREATE TABLE `flum ...
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...
随机推荐
- Redis和springboot 整合redisUtil类
一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Elasticsearch内存分配设置详解(转)
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题.这里有两种方式修改Elastics ...
- JavaScript进阶 - 第4章 跟着我的节奏走(流程控制语句)
第4章 跟着我的节奏走(流程控制语句) 4-1 做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF) ...
- IOS 打包提示 No iTunes Connect access for the team
1.可以在提示页直接点击 Manage Accounts按钮,进去页面后,选择开发者账号点减号删除:(或者在Xcode中直接按command+键进入,选择accounts,选中账号按-键删除) 2.完 ...
- 学习flask的网址
学习flask的网址: http://www.bjhee.com
- 关系型数据库---MySQL---数据库设计三大范式
1.第一范式: 1.1.1 数据表的每个数据列具有原子性: 1.1.2 同一个数据表中内容相似的数据列必须消除: 2.第二范式: 第一范式的基础上,每个数据表只描述一件事: 3.第三范式: 第二范式的 ...
- Codeforces Round #378 (Div. 2) D. Kostya the Sculptor 分组 + 贪心
http://codeforces.com/contest/733/problem/D 给定n个长方体,然后每个长方体都能选择任何一个面,去和其他长方体接在一起,也可以自己一个,要求使得新的长方体的最 ...
- (转)网站DDOS攻击防护实战老男孩经验心得分享
网站DDOS攻击防护实战老男孩经验心得分享 原文:http://blog.51cto.com/oldboy/845349
- Php—AJAX跨域问题
<?php /** * ajax proxy * ajax跨域解决办法 * @author suconghou <suconghou@126.com> * @version v1. ...
- 一个好用的压力测试工具tsung
一个好用的压力测试工具tsung 前段时间一直在忙各种事情,快三周没弄过引擎了,今天有点时间,正好之前写的服务器引擎也到了收尾测试的阶段,于是就研究了下怎么测试服务器压力. ...