關於mysql自增字段問題


最近遇到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種方法:

  1. truncate table 你的表名 (這樣不但將數據全部刪除,而且重新定位自增的字段)

  2. 刪除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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM