美文网首页代码改变世界
关于mysql自增字段问题

关于mysql自增字段问题

作者: dnaEMx | 来源:发表于2015-02-15 18:15 被阅读253次

最近遇到mysql字段的自增问题,需要临时处理一下,然后就顺便补补课,这样就有了这样一篇文章。

1.自增值是什么

他是一个字段属性,是用来创建唯一标识的列的

The AUTO_INCREMENT attribute can be used to generate a unique identity for new rows:

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 |
+----+---------+

他有以下的特征

 1.唯一的,并且顺序的,插入或者delete甚至 update都会计数,或者我理解为动作计数而不是值计数
 2.超过自身字段的最大值就无法写入,会报错,如键重复Duplicate entry

如何查看这个属性(三个方法)

  • show create table wp_options(举例)
    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字段的值是经常会出现重复的

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属性,这样就会重新排序

    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);

引用参考:

  1. http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html
  2. http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-handling.html

原文链接:http://www.godblessyuan.com/2015/01/11/mysql-auto_increment/

相关文章

  • 关于mysql自增字段问题

    最近遇到mysql字段的自增问题,需要临时处理一下,然后就顺便补补课,这样就有了这样一篇文章。 1.自增值是什么 ...

  • mysql 中 Duplicate entry '127

    mysql 中"Duplicate entry '255' for key 'PRIMARY'" 自增字段达到了上...

  • Mysql-sequence的实现

    在Oracle中,我们经常使用sequence来建立一个自增字段,在Mysql中,也有自增,但是。。(以下省略一千...

  • mysql使用简单技巧

    1.将非主键设置为自增mysql的自增列只能存在一个。若为非主键的自增,则需要增加如下索引,即可设置为自增字段 2...

  • mysql关于自增

    自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增 列) create table...

  • 关于自增id 你可能还不知道

    导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键。本篇...

  • mysql同表批量增加数据

    自增字段无视

  • mysql 自增、计算字段、三范式

    select concat(name,id) as stuinfo from 表名;查看当前表名中的名字和id去除...

  • sql server实用sql语句

    常用SQL 新增自增字段 新增id字段,设置为自增 BETWEEN ... AND 用法(包含2020-05-21...

  • mysql使用自增主键有何优势

    mysql使用什么字段做主键,是重点考虑两方面:业务场景和效率问题。在满足业务场景的前提下,使用自增序列做主键是最...

网友评论

    本文标题:关于mysql自增字段问题

    本文链接:https://www.haomeiwen.com/subject/pjaexttx.html