解析mysql中的auto_increment的問題
今兒在逛論壇時,發(fā)現(xiàn)一個看似很簡單的問題,卻引起了大家的廣泛關注:
這是一道很早的面試題:
一張表,里面有ID自增主鍵,當insert了17條記錄之后,刪除了第15,16,17條記錄,再把Mysql重啟,再insert一條記錄,這條記錄的ID是18還是15 。
答案:
如果表的類型是MyISAM,那么是18。
因為MyISAM表會把自增主鍵的最大ID記錄到數(shù)據(jù)文件里,重啟MySQL自增主鍵的最大ID也不會丟失。
如果表的類型是InnoDB,那么是15。
InnoDB表只是把自增主鍵的最大ID記錄到內(nèi)存中,所以重啟數(shù)據(jù)庫或者是對表進行OPTIMIZE操作,都會導致最大ID丟失。
自己也做了個實驗,結果證實了上面的說法。真是慚愧啊,看似簡單的問題自己也打錯了。
mysql> select * from test1;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 陳兵輝 |
| 2 | chen |
| 3 | chen |
| 4 | chen |
| 5 | chen |
| 6 | chen |
| 7 | chen |
| 8 | chen |
| 9 | chen |
| 10 | chen |
| 11 | chen |
+----+-----------+
11 rows in set (0.00 sec)
mysql> delete from test1 where id in (10,11,9);
Query OK, 3 rows affected (0.03 sec)
mysql> show create table test1;
CREATE TABLE `test1` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=<SPAN style="COLOR: #ff0000">12</SPAN> DEFAULT CHARSET=utf8 |
mysql> exit;
Bye
[root@fsailing1 ~]# service mysqld restart
停止 MySQL: [確定]
啟動 MySQL: [確定]
[root@fsailing1 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.95 Source distribution
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show create table test1;
| CREATE TABLE `test1` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=<SPAN style="COLOR: #ff0000">9</SPAN> DEFAULT CHARSET=utf8 |
2,另外還有一個就是獲取當前數(shù)據(jù)庫表的自增字段數(shù)。
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
- MySQL自增鎖(Auto-Increment Lock) 的原理使用
- mysql?自增長約束(auto_increment)的使用
- MySQL自增列解析(Auto_increment)
- MySQL中使用auto_increment修改初始值和步長
- MySQL AUTO_INCREMENT 主鍵自增長的實現(xiàn)
- 詳細聊聊MySQL中auto_increment有什么作用
- MySQL 序列 AUTO_INCREMENT詳解及實例代碼
- MySQL查詢和修改auto_increment的方法
- 怎么重置mysql的自增列AUTO_INCREMENT初時值
- MySQL 設置AUTO_INCREMENT 無效的問題解決
相關文章
mysql中count(), group by, order by使用詳解
mysql中order by 排序查詢、asc升序、desc降序,group by 分組查詢、having 只能用于group by子句、作用于組內(nèi),having條件子句可以直接跟函數(shù)表達式。使用group by 子句的查詢語句需要使用聚合函數(shù)。2017-05-05Mysql數(shù)據(jù)庫之常用sql語句進階與總結
這篇文章主要介紹了Mysql數(shù)據(jù)庫之常用sql語句,總結分析了MySQL數(shù)據(jù)庫常用的查詢、條件查詢、排序、連接查詢、子查詢等相關操作技巧,需要的朋友可以參考下2019-11-11Navicat連接MySQL時出現(xiàn)的連接失敗問題及解決
這篇文章主要介紹了Navicat連接MySQL時出現(xiàn)的連接失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05MySQL常用命令 MySQL處理數(shù)據(jù)庫和表的命令
這篇文章主要介紹了MySQL常用命令,尤其是針對MySQL處理數(shù)據(jù)庫和表的命令進行學習,特別適用于新手,感興趣的小伙伴們可以參考一下2015-11-11mysql性能優(yōu)化工具--tuner-primer使用介紹
這篇文章主要介紹了mysql性能優(yōu)化工具--tuner-primer的使用方法與返回數(shù)據(jù)分析,需要的朋友可以參考下2016-05-05mysql oracle和sqlserver分頁查詢實例解析
最近簡單的對oracle,mysql,sqlserver2005的數(shù)據(jù)分頁查詢作了研究,把各自的查詢的語句貼到腳本之家平臺供大家參考2017-10-10