replace into 和insert ignore是基于唯一索引或主键基础上使用的
首先创建一张charu表,
-- ----------------------------
-- Table structure for `charu`
-- ----------------------------
DROP TABLE IF EXISTS `charu`;
CREATE TABLE `charu` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL DEFAULT '' ,
`addr` varchar(250) CHARACTER SET gbk COLLATE gbk_chinese_ci NULL DEFAULT '' ,
`number` varchar(150) CHARACTER SET gbk COLLATE gbk_chinese_ci NOT NULL DEFAULT '' ,
`pubdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`),
UNIQUE INDEX `examp` USING BTREE (`name`, `number`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ci
AUTO_INCREMENT=8
;
1. 首先创建一张charu表,并创建联合唯一索引(name+number),pubdate为当前时间戳
2. 插入一条数据
insert into charu(name,addr,number) VALUES('a','b','123456');
执行结果如下:
这时如果再执行上面insert 语句,就会报错,提示name+number重复
3. 使用replace into
3.1
replace into charu(name,addr,number) values('a','b','123456');
执行结果:
分析: 时间和ID更新了,可以看出执行了删除和插入操作
3.2
replace into charu(name,addr,number) values('ab','b','123456');
执行结果:
分析:插入了一条新数据,同insert into
3.3
replace into charu(name,addr,number) values('a','bc','123456');
执行结果
分析:id为9的更新成ID为11的数据,同时成功的将addr更新为bc,从pubdate上看,是删除原来的并重新插入了
4. 使用insert ignore into
4.1
INSERT IGNORE INTO charu(name,addr,number) values('a','b','123456');
执行结果:
分析:记录无变化,不会提示错误
4.2
INSERT IGNORE INTO charu(name,addr,number) values('ab','b','123456');
执行结果
分析:插入新数据
4.3
INSERT IGNORE INTO charu(name,addr,number) values('a','bc','123456');
执行结果
分析:记录无变化
结论:
replace into执行过程总是删除后插入新记录
replace into主键相同,主键之外字段会得到更新,而insert ignore into 不会
两者只要主键不通功能同insert into
replace into和insert ignore into 与insert into区别在于insert into插入与主键相同记录会报错而前者不会