• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用AUTO_INCREMENT

    AUTO_INCREMENT属性可用于为新行生成唯一标识:

    CREATE TABLE animals (
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (id)
    );
    
    INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');
    
    SELECT * FROM animals;
    

    哪个返回:

    +----	+---------	+
    | id | name    |
    +----	+---------	+
    |  1 | dog     |
    |  2 | cat     |
    |  3 | penguin |
    |  4 | lax     |
    |  5 | whale   |
    |  6 | ostrich |
    +----	+---------	+
    

    没有为该AUTO_INCREMENT列指定值,因此MySQL自动分配了序列号。除非NO_AUTO_VALUE_ON_ZERO启用了SQL模式,否则还可以将0显式分配给该列以生成序列号。例如:

    INSERT INTO animals (id,name) VALUES(0,'groundhog');
    

    如果声明了该列NOT NULL,则还可以分配NULL给该列以生成序列号。例如:

    INSERT INTO animals (id,name) VALUES(NULL,'squirrel');
    

    当您将任何其他值插入到AUTO_INCREMENT列中时,该列将被设置为该值,并且将重置序列,以使下一个自动生成的值从最大列的值开始依次出现。例如:

    INSERT INTO animals (id,name) VALUES(100,'rabbit');
    INSERT INTO animals (id,name) VALUES(NULL,'mouse');
    SELECT * FROM animals;
    +-----	+-----------	+
    | id   | name       |
    +-----	+-----------	+
    | 1  | dog        |
    | 2  | cat        |
    | 3  | penguin    |
    | 4  | lax        |
    | 5  | whale      |
    | 6  | ostrich    |
    | 7  | groundhog  |
    | 8  | squirrel   |
    | 100  | rabbit     |
    | 101  | mouse      |
    +-----	+-----------	+
    

    更新现有AUTO_INCREMENT列值也会重置AUTO_INCREMENT序列。

    您可以AUTO_INCREMENT使用LAST_INSERT_ID()SQL函数或mysql_insert_id()C API函数检索最新自动生成的值。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。

    为该AUTO_INCREMENT列使用最小的整数数据类型,该类型应足够大以容纳所需的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试将失败。UNSIGNED如果可能,请使用该属性以允许更大的范围。例如,如果使用TINYINT,则最大允许序列号为127。对于TINYINT UNSIGNED,最大允许序列号为 255。有关的信息,请参见“整数类型(精确值)-INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT”。所有整数类型的范围。

    注意

    对于多行插入,LAST_INSERT_ID()mysql_insert_id()实际返回AUTO_INCREMENT从钥匙第一插入行的。这样可以在复制设置中的其他服务器上正确地复制多行插入。

    要以AUTO_INCREMENT非1 开头的值,请使用CREATE TABLE或设置该值ALTER TABLE,如下所示:

    mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
    

    InnoDB注意事项

    有关AUTO_INCREMENT特定于的用法的信息InnoDB,请参见“ InnoDB中的AUTO_INCREMENT处理”。

    MyISAM笔记

    • 对于MyISAM表,可以AUTO_INCREMENT在多列索引的第二列中指定。在这种情况下,该AUTO_INCREMENT列的生成值计算为。当您要将数据放入有序组中时,这很有用。MAX( uto_increment_column) + 1 WHERE prefix=given-prefix

      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;
      

      哪个返回:

      +--------	+----	+---------	+
      | grp    | id | name    |
      +--------	+----	+---------	+
      | fish   |  1 | lax     |
      | mammal |  1 | dog     |
      | mammal |  2 | cat     |
      | mammal |  3 | whale   |
      | bird   |  1 | penguin |
      | bird   |  2 | ostrich |
      +--------	+----	+---------	+
      

      在这种情况下(当AUTO_INCREMENT列是多列索引的一部分时),AUTO_INCREMENT如果删除AUTO_INCREMENT任何组中具有最大值的行,则将重用值。即使对于通常不会重用MyISAMAUTO_INCREMENT值的表,也会发生这种情况。

    • 如果该AUTO_INCREMENT列是多个索引的一部分,则MySQL使用从该AUTO_INCREMENT列开始的索引(如果有的话)生成序列值。例如,如果 nimals表包含索引PRIMARY KEY(grp, id)INDEX(id),MySQL将忽略PRIMARY KEY用于生成序列值的。结果,该表将包含一个序列,而不是每个grp值一个序列。

    进一步阅读

    有关更多信息,AUTO_INCREMENT请参见:

    • 如何将AUTO_INCREMENT属性分配给列:“ CREATE TABLE语句”和“ ALTER TABLE语句”。
    • 如何AUTO_INCREMENT依赖于的行为NO_AUTO_VALUE_ON_ZERO SQL模式:第5.1.11,“SQL服务器模式”。
    • 如何使用该LAST_INSERT_ID()函数查找包含最新AUTO_INCREMENT值的行:“信息函数”。
    • 设置AUTO_INCREMENT要使用的值:“服务器系统变量”。
    • “ InnoDB中的AUTO_INCREMENT处理”
    • AUTO_INCREMENT和复制:“复制和AUTO_INCREMENT”。
    • AUTO_INCREMENT uto_increment_increment uto_increment_offset)有关的可用于复制的服务器系统变量:“服务器系统变量”。