首页 > 代码库 > 关于mysql自增字段问题
关于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教程网
关于mysql自增字段问题