前面写过一篇相关的用replace into实现的文章,
(http://blog.csdn.net/asktommorow/article/details/53857136)但replace into有个缺点,会覆盖相应的数据,今天看到了一个新方法,测了一下。
-----------------------INSERT INTO ON DUPLICATE KEY UPDATE
drop table testa;
create table testa(id int primary key AUTO_INCREMENT,name varchar(10),note varchar(10),
`UPDATE_TIME` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `BPK_AK_KEY_2` (`name`,`note`)
);
insert into testa(name,note) values('XB','1111111'),('XH','2222222');
select * from testa;
INSERT INTO testa (id,name)
VALUES (2, 'XHua')
ON DUPLICATE KEY UPDATE
name='XHua'
INSERT INTO testa (id,name)
VALUES (3, 'XHua')
ON DUPLICATE KEY UPDATE
name='XHua'
-- 不涉及主键插入(相当于直接插入数据)
INSERT INTO testa (name)
VALUES ('XHua')
ON DUPLICATE KEY UPDATE
name='XHua'
-- 表增加唯一约束插入测试
INSERT INTO testa (id,name)
VALUES (2, 'XHua')
ON DUPLICATE KEY UPDATE
name='XHuaaa' -- update
-- 唯一约束重复插入
INSERT INTO testa (name,note)
VALUES ('XB', '1111111')
ON DUPLICATE KEY UPDATE
name='XHua' -- update
-- ON DUPLICATE KEY UPDATE 按照主键重复判断更新还是插入,
-- 更新数据不会丢失数据(不同于replace into)。但更新时信息提示受影响的行: 2,
-- 仍有可能先删除,后插入,不过插入时会对数据进行处理,避免原来存在的数据被覆盖掉。