mysql 插入重复数据的处理

mysql手册

  • 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;
2560633-2430ad7a67c01ec5.png
执行更新前.png

执行 insert into test (uid,content) values (2,'four') on duplicate key update id=id+1 之后,发现只更新了 id 其他的数据并没有更新

2560633-08a276e5e1fe166e.png
执行更新后

方案二、 replace into

2560633-c1e1996006813390.png
执行前

运行sql replace into test (uid,content) values (3,'three')
2560633-ce4af80e41ddb39e.png
执行后

2560633-578334b425093ac2.png
改变字段值

总结

  • 必须要有唯一索引
  • 只有唯一索引的值不会变,其他的值都会变,包括自增ID
  • 是先删除旧的数据然后插入新的,在这个过程中,还需要重新维护索引,所以速度会慢

方案三、 insert ignore into 这个语法会忽略报错

方案四,先查询,再做插入还是更新的判断。

四是最不推荐的方案,个人是推荐平时项目中使用 方案二

猜你喜欢

转载自blog.csdn.net/weixin_33815613/article/details/86822915