背景表
CREATE TABLE `names` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
`age` int(10) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `i_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8
下面的命令在记录不存在(根据唯一索引判断 包括主键)时会执行插入操作
INSERT INTO
表中有重复的名称时报 Duplicate entry 'value' for key 'column' 错误
INSERT IGNORE INTO
有重复的话不做任何处理 虽然不报错了 但也不修改 相当于putIfAbsent
REPLACE INTO
如有重复删除该条记录在插入 如果是自增id且是逻辑外键的话那乐子就大了
如果语句中没有包含所有字段 那么在修改时没有包含的字段值为初始值 因为时delete+insert吗
在5.7 RBR模式下主从同步时 主库比从库的自增id大 主从切换后插入数据主键重复问题
高并发死锁
INSERT .... ON DUPLICATE KEY UPDATE
记录不存在insert存在update 相当于save 起码不会发生开局手拿屠龙
INSERT IGNORE INTO names(name,age) VALUES('王五',22)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
age = 35
VALUES() 是针对同时插入多条记录时获取正确的待设置值
高并发死锁
能不用replace into和insert duplicate就不用
可以先查看判断决定是新增还是修改
可以直接先修改在根据结果是否新增 或反过来
十一路的Mysql replace into 与 insert into on duplicate key update 死锁和性能测试