最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

執(zhí)行以下語(yǔ)句進(jìn)行修改

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

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

如果使用的數(shù)據(jù)庫(kù)管理軟件是Navicat,那可以選中表右鍵選擇截?cái)啾?,其效果和TRUNCATE的效果是一樣的。

2.在刪除時(shí)解決

//刪除信息
    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)唯一鍵沖突導(dǎo)致自增字段值不連續(xù)

示例1:創(chuàng)建數(shù)據(jù)表tb_student3,插入導(dǎo)致唯一鍵沖突的記錄后,在插入數(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字段有唯一鍵約束,當(dāng)插入相同內(nèi)容的字段時(shí),會(huì)報(bào) Duplicate key error(唯一鍵沖突)。

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

2)刪除字段導(dǎo)致自增字段值不連續(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)

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

3)其他

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

解決方法

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

SET @i=0;

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

ALTER TABLE `tablename` AUTO_INCREMENT=0

我們執(zhí)行上面由于唯一鍵沖突導(dǎo)致自增不連續(xù)的數(shù)據(jù)表,會(huì)發(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'語(yǔ)句來操作,比delete效率高,并且會(huì)將自增歸零

總結(jié)

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

相關(guān)文章

  • phpmyadmin報(bào)錯(cuò):#2003 無法登錄 MySQL服務(wù)器的解決方法

    phpmyadmin報(bào)錯(cuò):#2003 無法登錄 MySQL服務(wù)器的解決方法

    通過phpmyadmin連接mysql數(shù)據(jù)庫(kù)時(shí)提示:“2003 無法登錄 MySQL服務(wù)器”。。。很明顯這是沒有啟動(dòng)mysql服務(wù),右擊我的電腦-管理-找到服務(wù),找到mysql啟動(dòng)一下
    2012-04-04
  • MySQL數(shù)據(jù)庫(kù)安全之防止撰改的方法

    MySQL數(shù)據(jù)庫(kù)安全之防止撰改的方法

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)防止撰改的方法,需要的朋友可以參考下
    2014-07-07
  • Windows?Server?2019部署MySQL?8完整步驟教程

    Windows?Server?2019部署MySQL?8完整步驟教程

    MySQL在開發(fā)開源軟件時(shí)經(jīng)常被當(dāng)作該軟件的數(shù)據(jù)管理系統(tǒng),所以我們?cè)陂_發(fā)時(shí)將會(huì)經(jīng)常用到它,所以如何安裝MySQL就是一個(gè)問題了,這篇文章主要介紹了Windows Server 2019部署MySQL 8的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • MySQL循環(huán)查詢的實(shí)現(xiàn)示例

    MySQL循環(huán)查詢的實(shí)現(xiàn)示例

    MySQL循環(huán)查詢是指在MySQL數(shù)據(jù)庫(kù)中使用循環(huán)結(jié)構(gòu)進(jìn)行數(shù)據(jù)查詢的一種方法,本文主要介紹了MySQL循環(huán)查詢的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • MySQL 主從復(fù)制部署及驗(yàn)證(示例詳解)

    MySQL 主從復(fù)制部署及驗(yàn)證(示例詳解)

    本文介紹MySQL主從復(fù)制部署步驟及學(xué)校管理數(shù)據(jù)庫(kù)創(chuàng)建腳本,包含表結(jié)構(gòu)設(shè)計(jì)、示例數(shù)據(jù)插入和查詢語(yǔ)句,用于驗(yàn)證主從同步功能,感興趣的朋友一起看看吧
    2025-07-07
  • MySQL實(shí)現(xiàn)雪花Id函數(shù)

    MySQL實(shí)現(xiàn)雪花Id函數(shù)

    相比UUID無序生成的id而言,雪花算法是有序的,而且都是由數(shù)字組成,本文主要介紹了MySQL實(shí)現(xiàn)雪花Id函數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • MySQL進(jìn)階SELECT語(yǔ)法篇

    MySQL進(jìn)階SELECT語(yǔ)法篇

    從這個(gè)基本語(yǔ)法可以看出,最簡(jiǎn)單的SELECT語(yǔ)句是SELECT select_list,實(shí)際上利用這個(gè)最簡(jiǎn)單的SELECT語(yǔ)句,你也可以完成許多你期待的功能,首先你能利用它進(jìn)行MySQL所支持的任何運(yùn)算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運(yùn)用SELECT語(yǔ)句的這種功能,你就可以自由地運(yùn)用MySQL的函數(shù)為PHP程序進(jìn)行各種運(yùn)算,并賦值給變量。在很多的時(shí)候,你會(huì)發(fā)現(xiàn)MySQL擁有許多比PHP更為功能強(qiáng)大的函數(shù)。
    2008-04-04
  • mysql本地安裝過程詳解

    mysql本地安裝過程詳解

    本文詳細(xì)介紹了在Windows、macOS和Linux(Ubuntu)三大主流系統(tǒng)下MySQL的本地安裝流程、配置步驟和常見問題解決方法,適合新手快速上手并順利完成環(huán)境搭建與基本驗(yàn)證
    2025-10-10
  • MySQL視圖中用變量實(shí)現(xiàn)自動(dòng)加入序號(hào)功能

    MySQL視圖中用變量實(shí)現(xiàn)自動(dòng)加入序號(hào)功能

    在 MySQL 中,視圖不支持直接使用變量來生成序號(hào),因?yàn)橐晥D是基于靜態(tài) SQL 查詢定義的,而變量是在運(yùn)行時(shí)動(dòng)態(tài)計(jì)算的,不過,你可以通過一些技巧來實(shí)現(xiàn)類似的效果,以下是一個(gè)常見的方法,使用子查詢來初始化變量,然后在視圖中使用這些變量,需要的朋友可以參考下
    2024-10-10
  • 一文搞懂Mysql中的共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場(chǎng)景

    一文搞懂Mysql中的共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場(chǎng)景

    剛開始學(xué)習(xí)MySQL中鎖的時(shí)候,網(wǎng)上一查出來一堆,什么表鎖、行鎖、讀鎖、寫鎖、悲觀鎖、樂觀鎖等等等,直接整個(gè)人就懵了,下面這篇文章主要給大家介紹了關(guān)于Mysql中共享鎖、排他鎖、悲觀鎖、樂觀鎖及使用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

寿光市| 渑池县| 安西县| 南京市| 兴和县| 玉环县| 漳浦县| 长垣县| 江西省| 皮山县| 怀化市| 永城市| 湖口县| 汽车| 久治县| 榕江县| 尼木县| 越西县| 子洲县| 天峻县| 平南县| 故城县| 巴塘县| 河源市| 巨鹿县| 奉化市| 绥阳县| 陆丰市| 顺义区| 杂多县| 邛崃市| 青龙| 汾西县| 彰武县| 揭东县| 平江县| 石狮市| 秭归县| 渑池县| 始兴县| 纳雍县|