开发者

MySQL数据库删除数据后自增ID不连续的问题及解决

目录
  • mysql数据库删除数据后自增ID不连续
    • 1.表中已经出现不连贯的数据ID时
    • 2.在删除时解决
  • MySQL自增字段不连续的原因分析
    • 造成自增字段不连续的原因
    • 解决方法
  • 总结

    MySQL数据库删除数据后自增ID不连续

    1.表中已经出现不编程客栈连贯的数据ID时

    执行以下语句进行修改

    SET @auto_id = 0;
    UPDATE 表名 SET 自增字段名 = (@auto_id := @auto_id + 1);
    ALTER TABLE 表名 AUTO_INCREMENT = 1;

    如果需要清空表的数据的话,最好使用TRUNCATE TABLE 表名来删除,这样新增的数据自增ID会从1开始,如果使用DELETE来删除,新增的数据会沿着之前的ID进行自增。

    如果使用的数据库管理软件是Navicat,那可以选中表右键选择截断表,其效果和TRUNCATE的效果是一样的。

    2.在删除时解决

    //删除信息
        public void delete(int id) {
            try {
                PreparedStatement ps = con.prepareStatement("delete from books where id = ?");
                ps.setInt(1, id);
                ps.executeUpdate();
                PreparedStatement pr = con.prepareStatement("alter table books auto_increment = ?;");
                pr.setInt(1, id - 1);
                pr.executeUpdate();
     
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    MySQL自增字段不连续的原因分析

    造成自增字段不连续的原因

    1)唯一键冲突导致自增字段值不连续

    示例1:创建数据表tb_student3,插入导致唯一键冲突的记录后,在插入数据

    mysql> CREATE TABLE tb_student3(
        -> id INTpython PRIMARY KEY AUTO_INCREMENT,
        -> name VARCHAR(20) UNIQUE KEY,
        -> age INT DEFAULT NULL);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> INSERT INTO tb_student3 VALUES(1,'1','1');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO tb_student3 VALUES(NULL,'1','1');
    ERROR 1062 (23000): Duplicate entry '1' for key 'name'
    
    ERROR 1062 (23000): Duplicate entry '1' for key 'name'
    mysql> INSERT INTO tb_student3 VALUES(NULL,'2','1');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SELECT * FROM tb_student3;
    +----+------+------+
    | id | name | age  |
    +----+------+------+
    |  1 | 1    |    1 |
    |  3 | 2    |    1 |
    +----+------+------+
    2 rows in set (0.00 sec)
    

    由于name字段有唯一键约束,当插入相同内容的字段时,会报 Duplicate key error(唯一键冲突)。

    在这之后,在插入新数据时, ,自增 id 就是 3,这样就出现了自增字段值不连续的情况。

    2)删除字段导致自增字段值不连续

    示例2:创建数据表tb_student4,删除新增的数据后,再次新增数据

    #创建新表
    mysql> CREATE TABLE IF NOT EXISTS tb_student4(
        -> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        -> name VARCHAR(10) NOT NULL);
    Query OK, 0 rows affected (0.02 sec)
    
    #新增字段
    mysql> INSERT INTO tb_student4(name) VALUES('Java'),('python');
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    #查看表内容
    mysql> SELECT * FROM tb_student4;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | JAVA   |
    |  2 | PYTHpythonON |
    +----+--------+
    2 rows in set (0.00 sec)
    
    #删除字段 name='PYTHON'
    mysql> DELETE FROM tb_student4 WHERE name='PYTHON';
    Query OK, 1 row affected (0.01 sec)
    
    #查看表内容
    mysql> SELECT * FROM tb_student4;
    +----+------+
    | ijsd | name |
    +----+------+
    |  1 | JAVA |
    +----+------+
    1 row in set (0.00 sec)
    
    #插入表数据
    mysql> INSERT INTO tb_student4(name) VALUES('MYSQL'),('html');
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    #查看表内容
    mysql> SELECT * FROM tb_student4;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | JAVA  |
    |  3 | MYSQL |
    |  4 | HTML  |
    +----+-------+
    3 rows in set (0.00 sec)
    

    可以看出,删除字段后,自增字段不会补齐而是按照既定数值继续向下排列,会导致自增数字不连续。

    3)其他

    还有一些情况会造成自编程客栈增不连续,比如事务回滚导致的自增键不连续、自增锁优化带来的不连续等。

    解决方法

    执行以下语句就可以解决

    SET @i=0;
    
    UPDATE `tablename` SET `id`=(@i:=@i+1);
    
    ALTER TABLE `tablename` AUTO_INCREMENT=0

    我们执行上面由于唯一键冲突导致自增不连续的数据表,会发现id字段的自增连续了。

    mysql> SET @i=0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> UPDATE `tb_student3` SET `id`=(@i:=@i+1);
    Query OK, 1 row affected (0.02 sec)
    Rows matched: 2  Changed: 1  Warnings: 0
    mysql> ALTER TABLE `tb_student3` AUTO_INCREMENT=0
        -> ;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0mysql> select * from tb_student3;
    +----+------+------+
    | id | name | age  |
    +----+------+------+
    |  1 | 1    |    1 |
    |  2 | 2    |    1 |
    +----+------+------+
    2 rows in set (0.00 sec)

    附:

    如果想要清空表的话可以使用TRUNCATE table 'good'语句来操作,比delete效率高,并且会将自增归零

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜