关于mysql自增字段问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于mysql⾃增字段问题
最近遇到字段的⾃增问题,需要临时处理⼀下,然后就顺便补补课,这样就有了这样⼀篇⽂章。
1.⾃增值是什么
他是⼀个字段属性,是⽤来创建唯⼀标识的列的
The AUTO_INCREMENT attribute can be used to generate a unique identity for new rows:
Shell
CREATE TABLE anima (
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 infoation_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',''),
('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);
本⽂来⾃:。