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

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

假设在一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;

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

mysql id 不连续_MySQL中自增主键不连续之解决方案。(20131109)相关推荐

  1. mysql自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 今天只做了一件事情,但解决了很大的问题.相信这也是令很多程序员和数据库管理员头疼的事情. 假设在一MySQL数据表中,自增的字段为id,唯一字段为abc, ...

  2. MyBatis 获取数据库中自增主键值

    一.在 SQL 映射文件的 select 标签中添加 useGeneratedKeys="true" 属性与 keyProperty=" " 属性,keyPro ...

  3. 七种MYSQL插入数据后返回自增主键ID的方法

    我们都知道,mysql中的insert插入之后会有返回值,返回的是影响的行数,也就是说,成功插入一条数据之后返回的是1,失败则返回0.那么,很多时候我们都想要得到最后插入的id值,下面七种方法均可,结 ...

  4. mysql复合主键优缺点_MySQL中的复合主键性能缺陷

    INSERT 和 UPDATE 性能变化很小: (INT) 和 (INT, INT) 键几乎相同 . SELECT 复合 PRIMARY KEY 的性能取决于很多因素 . 如果您的表是 InnoDB ...

  5. mysql自动编号_MySQL自动编号与主键

    1.自动编号(AUTO_INCREMENT),必须与主键组合使用 默认情况下,起始值为1,增量也为1. 2.主键(PRIMARY KEY) 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为 ...

  6. mysql id问题_MySQL分表自增ID问题的解决方法

    当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中. 应尽量避免使用自增IP来做为主键,为数据库分表操作带来极大的不便. 在postgreSQ ...

  7. mysql数据库主键自增6_mysql数据库,主键自增主键不连续

    解决方法:就是 删除数据之后,执行一下语句: 每次删除记录后,执行: ALTER table tableName AUTO_INCREMENT=1; 后面插入数据就是连续的了. MySQL复制表结构 ...

  8. 为什么 MySQL 的自增主键不单调也不连续

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 转自:真没什么逻辑/Draveness 当我们在使用关系型数据库时 ...

  9. 无法去掉自增标识_为什么 MySQL 的自增主键不单调也不连续

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

  10. MySQL之深入解析自增主键为何不连续

    一.前言 众所周知,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,大量的随机 IO,自增主键不连续.这应该是大家已经熟知的知识点,但是也应该还有不少的朋友不知道为何自增主键不是严格递 ...

最新文章

  1. 计算机网络-TCP运输连接管理
  2. linux 下修改最大文件数
  3. php与JAVA的RSA加密互通
  4. C++验证哥德巴赫猜想
  5. SketchUp Pro 2017 简体中文版的安装与破解
  6. Ubuntu18.04网络连接图标上显示问号
  7. 涂鸦LZ201-CN开发板学习笔记(一)
  8. 5月刊推荐:怎样才是真正的架构师
  9. 【华为OD机试真题 python】预订酒店【2022 Q4 | 100分】
  10. Yocto:将kernel, u-boot, atf单独建库编译摒弃掉打patch方式
  11. 怎么卸载apowerrec_Win10怎么卸载预装软件 Win10卸载预装应用教程
  12. 昨天是运气不好 今天是心情不好
  13. 【教学类-12-02】20221105《连连看12*4-分栏4-不重复24个)(小班主题《白天与黑夜》)
  14. 永远不可能学会的数论之基础数论(例题)
  15. 【Python游戏】Python实现一个Q版泡泡堂小游戏 | 附带源码
  16. vuforia ar unity 案例从零制作 三 番外 假如想在一个程序扫描多个图片,出现不同模型
  17. GD32读取GT30L32S4W字模芯片输出数据出错的总结
  18. terminate called after throwing an instance of ‘stdbad_alloc‘问题原因与解决
  19. 网址怎么输入打开?网站和网址有什么区别?
  20. Android通知系统源码解析

热门文章

  1. Ubuntu Server 18.04 安装
  2. python类代码编写细节
  3. 概率论:假设检验、极大似然估计、无偏估计
  4. python时间戳提取小时分钟秒,进行整点判断
  5. springboot pom.xml实战(com.mchange与c3p0配置)
  6. 【CITE】C#默认以管理员身份运行程序实现代码
  7. URL$HTTP协议
  8. 省选专练之后缀自动机zoj1729 Hidden Password
  9. 洛谷 3951 小凯的疑惑
  10. 分布式技术追踪 2018年第五期