MySQL中ID断层的问题如何处理

MySQL中删除和增加数据后ID出现断层问题,如何让ID重新连续,代码是在MySQL中运行吗。可以有具体的运行步骤吗

ID的作用是什么,为什么要不断层。非要不断层,那删除中间某一条数据是很麻烦的,如果有关联,那还得要处理关联数据。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/923835
  • 这篇博客你也可以参考下:如何在MySQl数据库中给已有的数据表添加自增ID?
  • 同时,你还可以查看手册:MySQL 字符集、对齐方式、统一编码 选择一个整理ID 中的内容
  • 除此之外, 这篇博客: mysql使用存储过程插入记录并返回自增id踩坑中的 mysql使用存储过程插入记录并返回自增id踩坑(由于不同表中相同字段导致的错误 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1. 附上mysql插入记录后返回自增id的方法链接

    mysql插入数据后返回自增ID的方法.

    2. 出问题的存储过程

    CREATE  PROCEDURE `proc_test`(IN tname VARCHAR(255),IN tpwd VARCHAR(255),OUT reid INT)
    BEGIN
    INSERT INTO test (uname,upsd)VALUES(tname,tpwd);
    SELECT max(uid) INTO reid FROM test;
    END
    

    运行测试之后,test数据表里成功多了一条记录,id也相应增加了,但返回值为null,最终发现返回null的原因是多个表中都存在名为uid的字段,而其它表中目前都为空,将uid改为 表名.字段名的形式后,问题解决,成功返回自增id。
    3. 修改后的存储过程

    CREATE  PROCEDURE `proc_test`(IN tname VARCHAR(255),IN tpwd VARCHAR(255),OUT reid INT)
    BEGIN
    INSERT INTO test (uname,upsd)VALUES(tname,tpwd);
    SELECT max(test.uid) INTO reid FROM test; #uid改为test.uid
    END
    

    这个只是非常简单基础的东西,至于高并发什么的,我目前没有遇到,还没有达到那个水平

    好吧,虽然这个问题很蠢,但真的困扰了我很久,当时学数据库得时候并没有系统地学习,都是用到什么搜什么,用完就过去了,也不理解原理什么的,当时还用的是半吊子水平的C#+sql server, 这次老师突然又让用,还要求必须java+mysql,这两当年学的时候前者只了解了一下最基本的知识,多线程都没搞清楚,后者就没有用过,只能硬着头皮瞎搞了……

    希望我这个小菜鸟少掉点头发!!!!
    希望我能顺利毕业!!!
    希望我接下来三年不要太痛苦!!!
    哦~加油鸭!!!!!!

  • 您还可以看一下 李胜金老师的MySQL数据库从入门到精通实战教程课程中的 MySQL 显示数据库实例小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对MySQL中删除或增加数据后出现ID断层的问题,可以采用以下几种方法:

    方法一: 在删除数据后,重新设置自增ID的当前值。具体操作如下:

    -- 假设book表的ID为自增字段
    -- 删除数据(例如删除ID=3的记录)
    DELETE FROM book WHERE ID=3;
    -- 重新设置book表的ID值,让ID从最大值开始自增。若表中已经存在数据,则ID会自动从表中现有ID最大值+1的位置开始自增
    ALTER TABLE book AUTO_INCREMENT=0;
    

    方法二: 对于ID无法重复的表,可以在表结构中把ID字段设置为自增并且主键,这样每次插入数据时ID都会自动从当前最大值+1开始自增。具体操作如下:

    ALTER TABLE node_table ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
    

    方法三: 对于有唯一ID且部分字段相同的记录查重,可以使用以下SQL语句进行查询:

    SELECT *
    FROM table_name
    WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY field1, field2, ...);
    

    其中field1、field2等为需要去重的相同字段,MAX(id)表示以id字段为依据,取相同字段中id最大的一条数据。

    方法四: MySQL根据双方的id进行分组并查询每组聊天记录中最新的一条数据,可以使用以下SQL语句进行查询:

    SELECT me_id,you_id,content,time
    FROM
    (SELECT me_id,you_id,content,time 
    FROM message m 
    WHERE 
    (m.me_id IN(SELECT me_id as chat_id FROM message e WHERE e.you_id = 'test' UNION SELECT you_id as chat_id FROM message e WHERE e.me_id = 'test') AND m.you_id = 'test')
    OR
    (m.me_id='test' AND m.you_id IN(SELECT me_id as chat_id FROM message e WHERE e.you_id = 'test' UNION SELECT you_id as chat_id FROM message e WHERE e.me_id = 'test'))
    ORDER BY time DESC LIMIT 999999) msg 
    GROUP BY msg.me_id+msg.you_id,ABS(msg.me_id-msg.you_id);
    

    其中me_id、you_id为聊天双方的ID,content表示聊天内容,time表示聊天时间。SQL语句先查询与用户id为test聊过天的所有消息记录,然后根据聊天双方的id进行分组并查询每组聊天记录中最新的一条数据。如果id是字符串类型,则可以使用ASCII码进行相加减,具体可参考上述SQL语句注释。