欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)的問題及解決

 更新時間:2024年06月05日 10:11:08   作者:迷失自我的小鹿  
這篇文章主要介紹了MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)

1.表中已經(jīng)出現(xiàn)不連貫的數(shù)據(jù)ID時

執(zhí)行以下語句進行修改

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

如果需要清空表的數(shù)據(jù)的話,最好使用TRUNCATE TABLE 表名來刪除,這樣新增的數(shù)據(jù)自增ID會從1開始,如果使用DELETE來刪除,新增的數(shù)據(jù)會沿著之前的ID進行自增。

如果使用的數(shù)據(jù)庫管理軟件是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自增字段不連續(xù)的原因分析

造成自增字段不連續(xù)的原因

1)唯一鍵沖突導致自增字段值不連續(xù)

示例1:創(chuàng)建數(shù)據(jù)表tb_student3,插入導致唯一鍵沖突的記錄后,在插入數(shù)據(jù)

mysql> CREATE TABLE tb_student3(
    -> id INT 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字段有唯一鍵約束,當插入相同內(nèi)容的字段時,會報 Duplicate key error(唯一鍵沖突)。

在這之后,在插入新數(shù)據(jù)時, ,自增 id 就是 3,這樣就出現(xiàn)了自增字段值不連續(xù)的情況。

2)刪除字段導致自增字段值不連續(xù)

示例2:創(chuàng)建數(shù)據(jù)表tb_student4,刪除新增的數(shù)據(jù)后,再次新增數(shù)據(jù)

#創(chuàng)建新表
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

#查看表內(nèi)容
mysql> SELECT * FROM tb_student4;
+----+--------+
| id | name   |
+----+--------+
|  1 | JAVA   |
|  2 | PYTHON |
+----+--------+
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)

#查看表內(nèi)容
mysql> SELECT * FROM tb_student4;
+----+------+
| id | name |
+----+------+
|  1 | JAVA |
+----+------+
1 row in set (0.00 sec)

#插入表數(shù)據(jù)
mysql> INSERT INTO tb_student4(name) VALUES('MYSQL'),('HTML');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

#查看表內(nèi)容
mysql> SELECT * FROM tb_student4;
+----+-------+
| id | name  |
+----+-------+
|  1 | JAVA  |
|  3 | MYSQL |
|  4 | HTML  |
+----+-------+
3 rows in set (0.00 sec)

可以看出,刪除字段后,自增字段不會補齊而是按照既定數(shù)值繼續(xù)向下排列,會導致自增數(shù)字不連續(xù)。

3)其他

還有一些情況會造成自增不連續(xù),比如事務回滾導致的自增鍵不連續(xù)、自增鎖優(yōu)化帶來的不連續(xù)等。

解決方法

執(zhí)行以下語句就可以解決

SET @i=0;

UPDATE `tablename` SET `id`=(@i:=@i+1);

ALTER TABLE `tablename` AUTO_INCREMENT=0

我們執(zhí)行上面由于唯一鍵沖突導致自增不連續(xù)的數(shù)據(jù)表,會發(fā)現(xiàn)id字段的自增連續(xù)了。

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效率高,并且會將自增歸零

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MySQL循環(huán)插入千萬級數(shù)據(jù)

    MySQL循環(huán)插入千萬級數(shù)據(jù)

    這篇文章主要介紹了MySQL如何實現(xiàn)循環(huán)插入千萬級數(shù)據(jù),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • MySQL 統(tǒng)計查詢實現(xiàn)代碼

    MySQL 統(tǒng)計查詢實現(xiàn)代碼

    MySQL 統(tǒng)計查詢其實就是通過SELECT COUNT() FROM 語法用于從數(shù)據(jù)表中統(tǒng)計數(shù)據(jù)行數(shù)
    2014-05-05
  • MySQL實現(xiàn)JDBC詳細步驟

    MySQL實現(xiàn)JDBC詳細步驟

    JDBC?是?Java?訪問數(shù)據(jù)庫的標準規(guī)范,真正怎么操作數(shù)據(jù)庫還需要具體的實現(xiàn)類,也就是數(shù)據(jù)庫驅(qū)動,本文給大家介紹MySQL實現(xiàn)JDBC詳細講解,感興趣的朋友一起看看吧
    2022-02-02
  • MySQL 觸發(fā)器的基礎操作(六)

    MySQL 觸發(fā)器的基礎操作(六)

    這篇文章主要為大家詳細介紹了MySQL 觸發(fā)器的基礎操作,告訴大家什么是MySQL觸發(fā)器,如何查看觸發(fā)器,感興趣的小伙伴們可以參考一下
    2016-08-08
  • MySQL生成千萬測試數(shù)據(jù)以及遇到的問題

    MySQL生成千萬測試數(shù)據(jù)以及遇到的問題

    前兩天發(fā)現(xiàn)同事要做一個對大表進行范圍查詢的功能,所以需要生成千萬數(shù)據(jù)進行性能測試,下面這篇文章主要給大家介紹了關于MySQL生成千萬測試數(shù)據(jù)以及遇到的問題的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • MySQL 格式化時間的實現(xiàn)示例

    MySQL 格式化時間的實現(xiàn)示例

    MySQL提供了多種日期和時間類型,在處理時間時需要根據(jù)不同類型選擇不同的格式化方法,常用的日期類型有DATE、YEAR、TIME;常用的日期時間類型有DATETIME和TIMESTAMP,本文就來介紹一下MySQL 格式化時間,感興趣的可以了解一下
    2023-10-10
  • mysqladmin、mysqlshow、mysqlcheck的工具使用

    mysqladmin、mysqlshow、mysqlcheck的工具使用

    我們一般使用mysql客戶端工具來進行日常的數(shù)據(jù)庫操作,本文主要介紹了mysqladmin、mysqlshow、mysqlcheck的工具使用,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • MySQL5.5版本安裝與安裝失敗詳細講解

    MySQL5.5版本安裝與安裝失敗詳細講解

    MySQL是一款安全、跨平臺、高效的,并與PHP、Java等主流編程語言緊密結合的數(shù)據(jù)庫系統(tǒng),下面這篇文章主要給大家介紹了關于MySQL5.5版本安裝與安裝失敗詳細講解的相關資料,需要的朋友可以參考下
    2023-03-03
  • MySQL timestamp與時區(qū)問題的解決

    MySQL timestamp與時區(qū)問題的解決

    本文主要介紹了MySQL timestamp與時區(qū)問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • mysql按照自定義(指定順序)排序的方法實例

    mysql按照自定義(指定順序)排序的方法實例

    在我們寫業(yè)務代碼的時候,會經(jīng)常碰見排序方式既不是正序也不是倒序,下面這篇文章主要給大家介紹了關于mysql按照自定義(指定順序)排序的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論