美文网首页代码改变世界
关于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自增字段问题

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