mysql不支持这个语句,insert overwrite通常出现在hive等数据处理工具中,执行覆盖写入操作
但是mysql虽然不支持insert overwrite语句,但是mysql有提供类似的功能,因为insert overwrite无非就是存在某些数据的时候就覆盖它,然后写入新的,起到一个数据重复时更新的作用,所以mysql也有类似的功能,当然由于架构的不同mysql的覆盖是生效在记录级别的
on duplicate key update语句
该语句作用为,当插入的数据重复时做更新操作,使用限制是目标数据表必须有主键,或某个字段有唯一约束,且插入数据也必须有该字段或主键数据,否则语句运行达不到预期,
INSERT INTO t(id,name,sex) VALUES (1,'帝骑王小明','男') on duplicate key update name='债皇-时王',sex='不清楚';
上面这条语句作用就是,在id为主键的表中插入一条数据,当id重复将该数据的name和sex值改变为相应值
insert ignore语句
这个语句的使用要求和ON DUPLICATE KEY UPDATE一样,不过它不会有修改操作,它的作用是忽略重复时报错,以警告的形式略过该条数据的改动
使用方法如下
insert ignore into t(id,name,sex) values (3,'大古','男');
语句执行时,如id为3的数据存在则添加无效
replace into语句
这个语句使用要求同上,它的作用是当重复时,先删除原有数据,随后执行添加操作,语句和普通的insert语句没区别,关键词不同而已
优先使用ON DUPLICATE KEY UPDATE,在具体使用的时候要注意一个问题,尽量不要使用自增主键,而且在实际开发中也很少有人用自增,一般都是uuid,因为除非你用第2个跳过插入另外两个语气,自增主键会发生跳号问题。
所谓的跳号,是因为mysql的插入语句是在执行之前如果你使用了自增主键,就会被预分配了一个,对于ON DUPLICATE KEY UPDATE来讲,触发更新的时候已有数据会被更新,而预分配出去的自增主键不会回退,下一条数据本来是它的id被上一条数据预分配了,所以在插入的时候就跳号了
replace into在冲突时,由于先做旧数据删除操作,所以新的数据ID本身就是跳号之后的自增数