问题

有一个表,建表语句如下:

CREATE TABLE `tbl_host` (
`id` bigint(64) NOT NULL AUTO_INCREMENT,
`ip` varchar(255) NOT NULL DEFAULT '',
`host_name` varchar(2555) NOT NULL DEFAULT '',
`timestamp` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_ip` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=84689426 DEFAULT CHARSET=utf8;

其中,

  • id为主键,自增字段
  • ip字段为唯一键

插入和更新表时使用sql语句:

insert into tbl_host(ip, host_name, timestamp) values ('%s', '%s', '%d') on duplicate key update host_name='%s', timestamp='%d'

当频繁update表记录时,通过

mysql> show create table tbl_host

发现AUTO_INCREMENT在不断增加。开始疑惑所使用的sql语句是不是有问题。

mysql官网给出说明:

With an auto-increment column, an INSERT statement increases the auto-increment value but UPDATE does not.

具体到INSERT ON DUPLICATE KEY UPDATE,即使最终执行了 update,自增ID也是会增长的。

如果id持续增长,会不会越界呢?对于int64数据类型,每分钟10w条记录更新,1亿年都消耗不完。所以,对于越界问题,可以放心使用。

建议

当遇到对表的操作是insert少, 需要大量update的情况,不建议使用insert into on duplicate key update。那如何处理情况呢?

  • 可以首先select,如果查到则update,否则insert。
  • 或者可以首先update,如果不存在,再insert。由于insert插入操作量少,大部分都是update,因此效率相对于前一种更好。具体代码可参考Go sql insert update使用举例

参考

mysql官网

https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

statckoverflow

https://stackoverflow.com/questions/23516958/on-duplicate-key-auto-increment-issue-mysql

mysql的AUTO_INCREMENT如果达到最大值会怎样呢?

https://blog.csdn.net/stpeace/article/details/78066262

insert into on duplicate key update的更多相关文章

  1. 【转】MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    原文链接:http://www.jb51.net/article/47090.htm   今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on ...

  2. mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

    replace into和insert into on duplicate key update都是为了解决我们平时的一个问题 就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录. ...

  3. SQL语句实现不存在即插入,存在则increase某字段的功能insert into … on duplicate key update

    前提条件:必须是唯一主键: CREATE UNIQUE INDEX idx_vote_object ON test_customers_vote (`vote_object`, `vote_objec ...

  4. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  5. Replace into 与Insert into on duplicate key update的区别

    前提条件:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用这2条语句没有意义.该语句会与INSERT相同 1. Replace into (1)   添加相同的主键 操作前       ...

  6. insert into ... on duplicate key update 与 replace 区别

    on duplicate key update:针对主健与唯一健,当插入值中的主健值与表中的主健值,若相同的主健值,就更新on duplicate key update 后面的指定的字段值,若没有相同 ...

  7. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDA ...

  8. INSERT 中ON DUPLICATE KEY UPDATE的使用

    如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE.例如,如果列a被定义为UNIQUE,并 ...

  9. mysql 插入重复值 INSERT ... ON DUPLICATE KEY UPDATE

    向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是saveOrUpdate操作.这种控制可以放在业务层,也可以放在数据库层,大多数数据库都支持这种需求 ...

随机推荐

  1. mod_fcgid: HTTP request length 136136 (so far) exceeds MaxRequestLen (131072)

    原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下: 查看官方说明有这么一句:Default: FcgidMaxRe ...

  2. ORACLE中使用DBMS_RANDOM去产生随机数

    一.生成随机字符串:DBMS_RANDOM.STRING 用法:DBMS_RANDOM.STRING(选项, 返回字符串长度) 选项有如下几种可供选择:1)'u', 'U' - returning s ...

  3. ES6 class的基本语法-学习笔记

    1.基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而已. 类的内部所有定义的方法,都是 ...

  4. 【转载】 Pytorch中的学习率调整lr_scheduler,ReduceLROnPlateau

    原文地址: https://blog.csdn.net/happyday_d/article/details/85267561 ------------------------------------ ...

  5. Python之路PythonNet,第三篇,网络3

    pythonnet   网络3 udp 通信 recvfrom sendtofork 多进程并发threading 多线程并发socketserver 系统模块 套接字的属性 setsockopt g ...

  6. loadrunner笔记---一

    1.Loadrunner主要由Vugen,Controller和Analyais3部分组成 2.简述描述集合点和集合点函数 集合点可以同步虚拟用户,以便能在同一时刻执行任务,集合点函数lr_rende ...

  7. vue elementui 写的一个后台管理页面模板

    https://github.com/PanJiaChen/vue-element-admin

  8. 快速排序改进——3区快速排序(3-way quicksort)

    1.快速排序缺陷 快速排序面对重复的元素时的处理方法是,把它放在了左部分数组或右部分数组,下次进行分区时,还需检测它.如果需要排序的数组含有大量重复元素,则这个问题会造成性能浪费. 解决方法:新增一个 ...

  9. 硬盘安装Linux(ubuntu,centos)

    硬盘安装Linux 使用硬盘安装Linux最大的好处不只是方便,是快速.之前使用U盘安装,很慢,没有记录具体时间.Ubuntu区别不大,本身比较小,安装介质只有2G(ubuntu18.10):Cent ...

  10. Wood Chipping Text Animation

    Blender Tutorial: Wood Chipping Text Animationhttps://www.youtube.com/watch?v=YFmN7eTNfNw 文字建模 木板建模, ...