代码之家  ›  专栏  ›  技术社区  ›  Charles Faiga

将InnoDB表中的AUTO_INCREMENT起始值设置为零?

  •  1
  • Charles Faiga  · 技术社区  · 16 年前

    是否有任何方法可以让InnoDB的AUTO_INCREMENT字段从0而不是1开始计数

    CREATE TABLE `df_mainevent` (
      `idDf_MainEvent` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`idDf_MainEvent`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    5 回复  |  直到 16 年前
        1
  •  6
  •   Lukasz Lysik    16 年前

    InnoDB将该行视为 它的新价值。

    因此,这意味着0是一个类似于NULL的“特殊”值。即使您使用AUTO_INCREMENT=0,也会将初始值设置为1。

    从MySQL 5.0.3开始,InnoDB 支持AUTO_INCREMENT=N表 语句,设置初始计数器 值或更改当前计数器 价值。此选项的效果是 本文前面讨论的原因 部分。

        2
  •  2
  •   Stefan Gehrig    16 年前
    CREATE TABLE `df_mainevent` (
      `idDf_MainEvent` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`idDf_MainEvent`)
    ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
    

    适用于MySQL>= 5.0.3.

    编辑:

    刚刚注意到MySQL一般不喜欢自动递增值等于 0 1

        3
  •  2
  •   Ross Smith II    13 年前

    1 不是一个 2 :

    CREATE TABLE ex1 (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM;
    
    SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
    
    INSERT INTO ex1 SET id=0;
    INSERT INTO ex1 SET id=NULL;
    
    SELECT * FROM ex1;
    
    +----+
    | id |
    +----+
    |  0 |
    |  1 |
    +----+
    2 rows in set (0.00 sec)
    
    CREATE TABLE ex2 (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
    
    SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
    
    INSERT INTO ex2 SET id=0;
    INSERT INTO ex2 SET id=NULL;
    
    SELECT * FROM ex2;
    
    +----+
    | id |
    +----+
    |  0 |
    |  1 |
    +----+
    2 rows in set (0.00 sec)
    
        4
  •  1
  •   Timothy McCune    13 年前


    例如:

    CREATE TABLE IF NOT EXISTS `table_name` (
    `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `Name` VARCHAR(100) NOT NULL, 
    PRIMARY KEY( `ID` )
    ) ENGINE=InnoDB  AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
    
    INSERT INTO `table_name` (`Name`) VALUES ('Record0?');
    UPDATE `table_name` SET `ID`=0 WHERE `ID`=1;
    INSERT INTO `table_name` (`Name`) VALUES ('Record1?');
    SELECT * FROM `table_name`;
    
    ID     Name
    0      Record0?
    2      Record1?
    

    蒂姆

        5
  •  0
  •   Daren Schwenke    16 年前

    我通常使用这个技巧来检测表中的删除。