测试用的mysql数据库:

 

新建测试表:

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `text` varchar(255) DEFAULT NULL,
  `uid` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid_unique` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

以上建表三个字段,id是主键自增,bigint类型。uid是字符串,但是加上了唯一约束’uid_unique‘。

 

(1) 添加新的数据

 

mysql replace into 实现存在则更新,不存在则插入

 

因为库里面没有新的数据,所以肯定是产生一条数据。

 

mysql replace into 实现存在则更新,不存在则插入

 

 (2) 产生一条新的数据,和 id 以及 uid都不冲突的

 

mysql replace into 实现存在则更新,不存在则插入

 

这个时候,因为id是主键自增的,所以这个时候,会产生一个次于最大值的值,就是1002 

 

mysql replace into 实现存在则更新,不存在则插入

 

(3)现在测试 id冲突,但是 uid不冲突的

 

mysql replace into 实现存在则更新,不存在则插入

 

mysql replace into 实现存在则更新,不存在则插入

 

发现会以id为 依据进行替换。

 

(4)测试uid冲突,但是id不冲突的。

 

mysql replace into 实现存在则更新,不存在则插入

 

结果:

 

mysql replace into 实现存在则更新,不存在则插入

 

发现会根据uid进行替换。

 

 (5)当id和uid都冲突的时候

 

mysql replace into 实现存在则更新,不存在则插入

 

mysql replace into 实现存在则更新,不存在则插入

 

发现会根据这些进行替换。

 

(6)当uid冲突的时候,且自增主键,id为空的时候

 

 mysql replace into 实现存在则更新,不存在则插入

 

mysql replace into 实现存在则更新,不存在则插入

 

 发现这个时候会删除这条信息,然后新生成一个id。

 

 

综上所述,总的来说replace into 操作的结果是: 首先会判断是否存在冲突,可以是主键冲突,也可以是唯一约束。 然后删除这些数据,然后再插入数据。删除数据后插入的效果就跟insert into是一样的。

 

相关文章: