本文转自:只会玩卡尔

-- 查询创建表语句
show create table person;
-- 创建person表,主键为int自增
CREATE TABLE `person` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `phone` varchar(32) DEFAULT NULL,
  `address` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 新增测试数据
insert into person(name,phone,address) values ('张三','18812345678','浙江省杭州市');
insert into person(name,phone,address) values ('李四','18712345678','湖南省长沙市');
insert into person(name,phone,address) values ('王五','18612345678','江苏省南京市');
-- 查询数据
select * from person;

person数据查询.png


执行replace into 语句:

replace into person(id,name,phone) values (1,'张三','18812345678') ;

执行完成replace into语句.png

再次进行查询:

image.png


执行replace into 语句:

replace into person(id,name,phone,address) values (4,'赵六','18512345678','河北省石家庄市');

执行完成replace into语句.png

再次进行查询:

image.png


根据如上执行过程可以看出:
第一次的replace into语句,为更新id=1的数据,结果影响了2行,并且更新后address字段值内容为空。
第二次的replace into语句,为新增id=4的数据,结果影响了1行。
通过查询资料发现,若更新原有数据,replace into会先删除掉原有数据,此时结果影响1行,随后又新增该更新后的语句,结果又影响1行,由于values中未带有address字段值内容,所以更新后数据address字段值为空。

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议