关于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种方法:
-
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教程网