- demo 数据表
方案一、 insert into table (字段,索引字段) values (字段,索引字段值) on duplicate key update 主键=主键
以上写法是在遇到唯一值的数据可以更新的时候,不要更新,只把主键的值加1
当然了,语法是这个语法,更新的处理可以自己处理,也可以是id=id
或者uid=uid+1
自己随便处理
总之,结果是其实没有更新数据,原始数据是不变的,只更新了key update
后面的字段
前提是要有唯一字段的值,否则是会正常插入数据的
适用于不需要更新,但想知道一共处理了多少条数据的场景,比如抓取数据
当然啦,最好还是不要更新主键,因为你原来对应的主键再加1,可能那个数字会跟下一条数据重复
CREATE TABLE `test` (
`content` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`uid` INT(11) UNSIGNED NOT NULL,
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
UNIQUE INDEX `unique` (`uid`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
执行 insert into test (uid,content) values (2,'four') on duplicate key update id=id+1
之后,发现只更新了 id
其他的数据并没有更新
方案二、 replace into
运行sql
replace into test (uid,content) values (3,'three')
总结
- 必须要有唯一索引
- 只有唯一索引的值不会变,其他的值都会变,包括自增ID
- 是先删除旧的数据然后插入新的,在这个过程中,还需要重新维护索引,所以速度会慢
方案三、 insert ignore into
这个语法会忽略报错
方案四,先查询,再做插入还是更新的判断。
四是最不推荐的方案,个人是推荐平时项目中使用 方案二