最近遇到mysql字段的自增問題,需要臨時處理一下,然后就順便補補課,這樣就有了這樣一篇文章。
1.自增值是什么
他是一個字段屬性,是用來創建唯一標識的列的
The AUTO_INCREMENT attribute can be used to generate a unique identity for new rows:
Shell
CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); SELECT * FROM animals; Which returns: +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
他有以下的特征
Shell
1.唯一的,並且順序的,插入或者delete甚至 update都會計數,或者我理解為動作計數而不是值計數 2.超過自身字段的最大值就無法寫入,會報錯,如鍵重復Duplicate entry
如何查看這個屬性(三個方法)
- show create table wp_options(舉例)
Shell
CREATE TABLE `wp_options` ( `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `option_name` varchar(64) NOT NULL DEFAULT '', `option_value` longtext NOT NULL, `autoload` varchar(20) NOT NULL DEFAULT 'yes',
-
show table status
-
SELECT table_name,Auto_increment FROM information_schema.tables WHERE Table_Schema=’wp';
btw:
官方提到:可以使用ALTER TABLE tbl AUTO_INCREMENT = 100;來恢復初始值,但是其實沒有說明清楚,這個值有內部計數函數,所以如果遇到的情況是這個值本用過,但后來刪除了,也是會繼續累積增加上去的,但有 一個情況,如果現在計數到100,而我插入一個1000,那么是可以通過這個語句來將1000恢復到101。
另外官方還提到:auto_increment還會區分InnoDB和MyISAM,myisam可以使用多個字段作為一個 auto_increment,而innodb不行,據此我的理解是,由於多個字段,所以唯一的屬性被放大到2個字段的組合的唯一值,所以,id字段可以 被復用,而innodb只能單個字段做auto_increment,所以如果在這個時候插入數據或者導入數據,而數據中的auto_increment 字段的值是經常會出現重復的
Shell
CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; Which returns: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich |
2.我所遇到的情況是需要導入數據,並且這些數據里面有自增值在阻攔導入,因為直接導入是會報鍵重復的(InnoDB)
如果我們需要完完全全的重置這個auto_increment的計數的話有2種方法:
-
truncate table 你的表名 (這樣不但將數據全部刪除,而且重新定位自增的字段)
-
刪除auto_increment字段,然后重新建字段並且授予auto_increment屬性,這樣就會重新排序
Shell
ALTER TABLE 表名 DROP id; alter table 表名 add id int(11) null first; ALTER TABLE 表名 MODIFY COLUMN id int(11) NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY(id);
- 本文來自:Linux教程網