新用户注册入口 老用户登录入口

[转载]mysql怎么让自增id不连续_MySQL中自增主键不连续之解决方案。(20131109)

文章作者:转载 更新时间:2023-08-26 08:19:54 阅读数量:91
文章标签:MySQLid连续性SQL语句主键修正关联表
本文摘要:在MySQL数据库管理中,针对具有自增主键(AUTO_INCREMENT)和唯一字段(唯一键)的数据表,在插入数据时若唯一键冲突或使用replace into语句,可能导致自增id不连续或关联表中的id值改变。为解决此问题,文章提出了一种解决方案:通过在每次插入操作后执行特定SQL语句(如`ALTER TABLE table AUTO_INCREMENT = (SELECT MAX(id) + 1 FROM table)`),动态调整自增主键以保证其连续性。尽管尝试使用触发器实现该目标未成功,但作者建议在特定场景下扩展一个名为insert_continuous_id的函数来确保自增主键连续插入,同时避免对所有插入操作进行不必要的修正,以体现高效且有针对性的编程原则。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39554172/article/details/113210084。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

今天只做了一件事情,但解决了很大的问题。相信这也是令很多程序员和数据库管理员头疼的事情。

假设在一MySQL数据表中,自增的字段为id,唯一字段为abc,还有其它字段若干。

自增:AUTO_INCREMENT

A、使用insert into插入数据时,若abc的值已存在,因其为唯一键,故不会插入成功。但此时,那个AUTO_INCREMENT已然+1了。

eg : insert into `table` set `abc` = '123'

B、使用replace插入数据时,若abc的值已存在,则会先删除表中的那条记录,尔后插入新数据。

eg : replace into `table` set `abc` = '123'

(注:上一行中的into可省略;这只是一种写法。)

这两种方法,效果都不好:A会造成id不连续,B会使得原来abc对应的id值发生改变,而这个id值会和其它表进行关联,这是更不允许的。

那么,有没有解决方案呢?

笨办法当然是有:每次插入前先查询,若表中不存在要插入的abc的值,才插入。

但这样,每次入库之前都会多一个操作,麻烦至极。

向同学请教,说用触发器。可在网上找了半天,总是有问题。可能是语法不对,或者是某些东西有限制。

其实,最终要做的,就是在每次插入数据之后,修正那个AUTO_INCREMENT值。

于是就想到,把这个最实质的SQL语句↓,合并在插入的SQL中。

PS:

ALTER TABLE `table` AUTO_INCREMENT =1

执行之后,不一定再插入的id就是1;而是表中id最大值+1。

这是MySQL中的执行结果。其它数据库不清楚。。。。

到这里,问题就变的异常简单了:在每次插入之后都重置AUTO_INCREMENT的值。

如果插入的自定义函数或类的名称被定义成insert的话,那么就在此基础上扩展一个函数insert_continuous_id好了,其意为:保证自增主键连续的插入。

为什么不直接修改原函数呢?

这是因为,并不是所有的insert都需要修正AUTO_INCREMENT。只有在设置唯一键、且有自增主键时才有可能需要。

虽然重置不会有任何的副作用(经试验,对各种情况都无影响),但没有必要就不要额外增加这一步。

一个优秀的程序员,就是要尽量保证写出的每一个字符都有意义而不多余。

啰啰嗦嗦的说了这么多,其实只有一句话:解决MySQL中自增主键不连续的方法,就是上面PS下的那一行代码。

附:

我写的不成功的触发器的代码。

-- 触发器

CREATE TRIGGER trigger_table after insert

ON table FOR EACH ROW

ALTER TABLE `table` AUTO_INCREMENT =1;

大家有想说的,请踊跃发言。期待更好更完美的解决方案。

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39554172/article/details/113210084。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
自增主键 (AUTO_INCREMENT)在MySQL等关系型数据库中,自增主键是一种特殊的字段类型设置,它会自动为每条新插入的记录生成一个唯一的、递增的整数值作为主键。在文章语境中,当表中的某个字段被定义为自增主键时,每次执行插入操作,系统会自动为该字段分配一个新的、大于已有最大值的整数,以此保证主键的唯一性。
唯一键 (unique key)在数据库设计中,唯一键约束是一种用于确保表中某列或某几列组合数据具有唯一性的机制。在文章提及的问题情境下,表中的“abc”字段被设为唯一键,意味着在同一张表内,不允许有两条记录的“abc”字段值相同。如果尝试插入已存在的“abc”值,数据库将拒绝此次插入操作以维持数据完整性。
触发器 (trigger)触发器是数据库管理系统中的一种数据库对象,它在特定数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行一段预定义的SQL代码。在文中提到的场景中,作者试图创建一个触发器来解决自增主键不连续的问题,即在每次向表中插入新记录后,通过触发器重置AUTO_INCREMENT值。然而,在实际应用中,由于语法限制或其他因素,文中所述的触发器实现方式并未成功解决问题。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在数据库管理系统中,自增主键的管理与维护是一项常见且关键的任务。MySQL作为广泛使用的开源关系型数据库,其AUTO_INCREMENT特性为表的主键提供了自动递增的功能,但在特定场景下,如遇到唯一键冲突时可能导致自增ID不连续的问题。近期,针对这一问题,有数据库专家和开发者们展开了深入探讨。
实际上,MySQL官方社区以及相关技术博客对此类问题已有多种解决方案提出。例如,除了文中提及的在每次插入操作后动态调整AUTO_INCREMENT值的方法外,还有一种观点是通过重构数据库设计,将自增ID与业务逻辑解耦,采用UUID或其他全局唯一标识符替代自增主键,以减少对连续性的依赖。同时,随着MySQL 8.0版本的发布,新增了序列(SEQUENCE)对象,提供了一种更为灵活的方式来生成唯一的序列号,可用于解决自增主键不连续的问题。
此外,在数据库优化方面,对于高并发环境下的插入操作,如何确保自增主键的连续性和唯一性变得更加复杂。一些大型互联网公司采用了分布式ID生成策略,如雪花算法(Snowflake),能够在分布式环境下实现高效且有序的ID生成,从而避免因单点故障或并发写入导致的自增主键断层。
值得注意的是,无论采取何种解决方案,都需要根据实际应用场景、数据量大小、并发访问量及性能需求等因素综合考虑。同时,理解并遵循数据库设计范式,合理规划表结构,也有助于从根本上减少此类问题的发生。总之,面对MySQL或其他数据库系统中的自增主键连续性挑战,持续关注最新的数据库技术和最佳实践,结合自身项目特点选择最优方案,才能确保系统的稳定、高效运行。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
renice priority_level -p pid - 更改已运行进程的优先级。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
可自定义logo的jQuery生成二维码插件 01-03 jquery每日签到日历插件 10-10 高度可定制的jQuery瀑布流网格布局插件 03-15 Consul中服务实例自动注销问题解析:健康检查、稳定性与Agent配置的影响及解决策略 01-22 怎么看mysql 的安装路径 12-31 jquery横向手风琴效果 12-23 蓝色数码电子产品销售HTML5网站模板 12-14 jQuery和CSS3汉堡包导航菜单打开动画特效 10-19 python模拟生存游戏 10-08 本次刷新还10个文章未展示,点击 更多查看。
jQuery.eraser-实现橡皮擦擦除功能的jquery插件 05-26 Netty中ChannelNotRegisteredException异常处理:理解原因与确保Channel注册状态的方法示例 05-16 响应式游戏开发类企业前端cms模板下载 05-02 精美的花甲美食网站HTML模板下载 03-09 soulmate粉色干净浪漫唯美婚礼单页响应式网站模板 03-07 Vue.js项目中proxyTable数据转发遭遇504错误:服务器响应时间与网络连接问题排查及解决方案 03-05 SpringCloud服务路由配置错误与失效:识别问题、排查步骤及组件解析这个涵盖了的核心内容,包括SpringCloud框架下的服务路由配置错误失效问题的识别,以及涉及到的服务注册中心、Gateway、Zuul等组件的功能解析和故障排查的具体步骤。同时,字数控制在了50个字以内,满足了要求。 03-01 css水平线长度设置 02-11 [转载]Proxy 、Relect、响应式 01-11 蓝色响应式软件营销代理公司网站静态模板 01-06 python正太分布校验 01-05
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"