【问题标题】:Set AUTO_INCREMENT starting value in a InnoDB table to zero?将 InnoDB 表中的 AUTO_INCREMENT 起始值设置为零?
【发布时间】:2009-10-16 14:46:58
【问题描述】:

是否有任何方法可以让 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;

【问题讨论】:

    标签: sql mysql innodb auto-increment


    【解决方案1】:

    MySQL 文档:

    如果用户指定 NULL 或 0 为 INSERT 中的 AUTO_INCREMENT 列, InnoDB 将行视为值 未指定并生成一个 新的价值。

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

    从 MySQL 5.0.3 开始,InnoDB 支持 AUTO_INCREMENT = N 表 CREATE TABLE 和 ALTER TABLE 中的选项 语句,设置初始计数器 值或更改当前计数器 价值。这个选项的效果是 因服务器重启而取消,对于 前面讨论过的原因 部分。

    【讨论】:

    【解决方案2】:
    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 的自动增量值 - 这与使用的存储引擎无关。 MySQL 只是使用1 作为第一个自增值。所以回答这个问题:NO这是不可能的,但它不依赖于存储引擎。

    【讨论】:

      【解决方案3】:

      这在 InnoDB 和 MyISAM 中都有效,第二个插入是 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】:

        Daren Schwenke 的技术奏效。糟糕的是,插入的下一条记录将是 2。
        例如:

        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?
        

        这没什么大不了的,只是烦人。

        提姆

        【讨论】:

        • 再做一个 ALTER TABLE table_name AUTO_INCREMENT=1;在第一次插入之后。
        【解决方案5】:

        我无法让自动增量从 0 开始,但从 1 开始然后通过 UPDATE 将其设置为 0 可以正常工作。

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

        在更新任何行时,我设置该行的最后更新时间。

        在删除时,我设置了第 0 行的最后更新时间。

        【讨论】:

          猜你喜欢
          • 2016-03-19
          • 2013-06-28
          • 1970-01-01
          • 2013-12-11
          • 1970-01-01
          • 2018-08-02
          • 2015-03-25
          • 2014-05-29
          • 2014-08-17
          相关资源
          最近更新 更多