mysql使用onduplicatekeyupdate时导致主键不连续自增

zhanzhijie zhanzhijie     2022-12-13     176

关键词:

使用on duplicate key update语法有时是很方便,但是会有一个影响:默认情况下,每次更新都会更新该表的自增主键ID,如果更新频率很快,会导致主键ID自增的很快,过段时间就超过数字类型的的范围了
解决这个问题,有两种方式:(实际目前的方式就是把自增主键ID设置为bigint,也有一部分操作先查询再选择插入OR更新)
方法一:拆分成两个动作,先查询,再更新
方法二:修改innodb_autoinc_lock_mode参数(不推荐)
  innodb_autoinc_lock_mode中有3种模式,0,1,2,数据库默认是1的情况下,就会发生上面的那种现象,每次使用insert into .. on duplicate key update 的时候都会把简单自增id增加,不管是发生了insert还是update
innodb_autoinc_lock_mode参数详解
tradition(innodb_autoinc_lock_mode=0) 模式:
1、它提供了一个向后兼容的能力
2、在这一模式下,所有的insert语句("insert like") 都要在语句开始的时候得到一个表级的auto_inc锁,在语句结束的时候才释放这把锁,注意呀,这里说的是语句级而不是事务级的,一个事务可能包涵有一个或多个语句。
3、它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave的时候还能生成和master那边一样的值(它保证了基于语句复制的安全)。
4、由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的插入。
consecutive(innodb_autoinc_lock_mode=1) 模式:
1、这一模式下去simple insert 做了优化,由于simple insert一次性插入值的个数可以立马得到确定,所以mysql可以一次生成几个连续的值,用于这个insert语句;总的来说这个对复制也是安全的(它保证了基于语句复制的安全)
2、这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要语句得到了相应的值后就可以提前释放锁
interleaved(innodb_autoinc_lock_mode=2) 模式
1、由于这个模式下已经没有了auto_inc锁,所以这个模式下的性能是最好的;但是它也有一个问题,就是对于同一个语句来说它所得到的auto_incremant值可能不是连续的。

使用 Python mysql.connector 远程连接 MySQL

】使用Pythonmysql.connector远程连接MySQL【英文标题】:RemotelyconnecttoMySQLwithPythonmysql.connector【发布时间】:2017-03-1116:00:14【问题描述】:以下代码(从与mysql服务器不同的机器运行,在同一个LAN中),使用Python3本地连接到MySQL数据库... 查看详情

mysql使用简单教程(代码片段)

本文通过演示如何使用MySQL客户机程序创建和使用一个简单的数据库,允许连接到MySQL服务器、运行查询和查看结果。mysql也可以在批处理模式下使用:预先将查询放在文件中,然后告诉mysql执行文件的内容。要查看mysq... 查看详情

MySQL:为啥在使用索引时仍然“使用文件排序”?

】MySQL:为啥在使用索引时仍然“使用文件排序”?【英文标题】:MySQL:whystill\'usingfilesort\'whenindexesareused?MySQL:为什么在使用索引时仍然“使用文件排序”?【发布时间】:2016-03-1013:17:53【问题描述】:mysql-5.6.24-win32.1432006610我... 查看详情

mysql使用包含变量的mysql查询创建视图

】mysql使用包含变量的mysql查询创建视图【英文标题】:mysqlcreateviewwithmysqlquerythatcontainsvariable【发布时间】:2013-04-2912:32:08【问题描述】:我想使用以下语法来创建MySQL视图:createview`ViewName`as(selectv_starting.callingname,v_starting.geofence... 查看详情

mysql安装与使用方法的具体简介

参考技术A  MySQL安装与使用    一什么是MySQL  MySQL(发音为MyEssQueEll)是Tcx公司()开发的一个多人使用多执行绪的SQL资料库ServerMySQL主要的目标在快速稳定和容易使用    MySQL可在此取得    二MySQL的安装  ... 查看详情

使用 MySQL 从 Firebase 推送通知

】使用MySQL从Firebase推送通知【英文标题】:PushNotificationfromFirebaseusingMySQL【发布时间】:2021-05-0506:06:27【问题描述】:我的应用正在发送应用内通知。使用MySQL表和侦听器。但我想使用Firebase的推送通知。我的数据库是MySQL。我想... 查看详情

oc怎么使用mysql或者swift怎么使用mysql

参考技术Aupdatetestsetid=UUID();MYSQL默认值设置UUID函数实际其函数除TIMESTAMP外都MYSQL默认值目前能数或者CURRENTTIMESTAMP需要实现UUID默认值功能则该表INSERT触发器实现:updatetestsetid=UUID();createTRIGGERtest_insertAFTERINSERTONtestFOReachROWBEGINupdatetestse... 查看详情

mysql自带工具使用介绍(代码片段)

...来操作管理MySQL服务器。可以通过mysql--help来查看其详细使用方法。1)-e、-u、-p、-h、-P、等选项的使用语法[root@mysql~]#mysql-uroot-p123-h192.168.1 查看详情

何时在 MYSQL 中使用 Sequelize?

】何时在MYSQL中使用Sequelize?【英文标题】:WhentouseSequelizewithMYSQL?【发布时间】:2019-09-0517:38:18【问题描述】:我正在尝试使用Nodejs学习SQL数据库,因为我只使用Nodejs使用NoSQL(Mongodb)。我已经安装了mysql数据库,并且可以使用Nodej... 查看详情

简单使用mysql索引

...,可以令MySQL的查询和运行更加高效。如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方 查看详情

MySQL 使用啥文件系统?

】MySQL使用啥文件系统?【英文标题】:WhatfilesystemdoesMySQLuse?MySQL使用什么文件系统?【发布时间】:2019-04-2711:40:43【问题描述】:在Linux操作系统上将数据库数据保存到磁盘时,MySQL是否使用fread、read、mmap或其他文件系统?或者... 查看详情

MySQL 最大内存使用量

】MySQL最大内存使用量【英文标题】:MySQLmaximummemoryusage【发布时间】:2010-11-1319:19:21【问题描述】:我想知道如何设置MySQL在Linux服务器上使用的内存量的上限。现在,MySQL将继续在请求每个新查询时占用内存,以致最终耗尽内... 查看详情

linux上mysql的使用

...l 第一次登录没有密码可以直接输入mysql 有密码可以使用   mysql-uroot-p 回车会提示需要输入密码 -u用户名-p密码   这个mysql文件在/usr/bin目录下,与后面讲的启动文件/etc/init.d/mysql不是一个文件  没有初... 查看详情

在 node-mysql 中使用 SSH 隧道连接到 MySQL

】在node-mysql中使用SSH隧道连接到MySQL【英文标题】:ConnecttoMySQLusingSSHTunnelinginnode-mysql【发布时间】:2014-03-2015:46:52【问题描述】:使用node-mysqlnpm包时,是否可以使用SSH密钥而不是密码连接到MySQL服务器?【问题讨论】:【参考... 查看详情

node.js如何使用mysql的连接池实例

http://www.111cn.net/database/mysql/90774.htm Nodejs如何使用MySQLNodejs要连接MySQL,可以使用Nodejs的MysQL驱动来实现。比如,我们这里使用“node-mysql”连接数据库。我们使用下面的方式来连接数据库:首先,我们需要使用nodejs的包管理工... 查看详情

MySQL 不使用索引;使用文件排序

】MySQL不使用索引;使用文件排序【英文标题】:MySQLnotusingindexes;usingfilesort【发布时间】:2011-06-3023:57:50【问题描述】:MySQL似乎没有使用索引,而是在以下查询中使用文件排序:SELECT`tweets`.*FROM`tweets`WHERE(`tweets`.contest_id=159)ORDERB... 查看详情

在mysql查询中使用参数时出现mysql语法错误

】在mysql查询中使用参数时出现mysql语法错误【英文标题】:gettingmysqlsyntaxerrorwhileusingparametersinmysqlquery【发布时间】:2022-01-2003:51:19【问题描述】:nodejs中出现sql语法错误我正在使用此代码:asyncfunctiongetNotificationFsql(data)varquery="s... 查看详情

Android + MySQL 使用 com.mysql.jdbc.Driver

】Android+MySQL使用com.mysql.jdbc.Driver【英文标题】:Android+MySQLusingcom.mysql.jdbc.Driver【发布时间】:2011-06-1603:46:39【问题描述】:我正在编写一个将连接到MySQL服务器的Android应用程序。现在,我正在使用http://localhost:3306/通过XAMPP在我... 查看详情