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

时间:2009-10-16 14:46:59

标签: sql mysql innodb auto-increment

是否有任何让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 个答案:

答案 0 :(得分:6)

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中的选项   声明,设置初始计数器   改变或改变当前的计数器   值。这个选项的效果是   由服务器重新启动取消,用于   前面讨论的原因   部分。

答案 1 :(得分: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作为第一个自动增量值。所以回答这个问题:这是不可能的,但它不依赖于存储引擎。

答案 2 :(得分:2)

这适用于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)

答案 3 :(得分:1)

达伦施文克的技术有效。坏的是插入的下一条记录将是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?

这不是什么大不了的事情。

答案 4 :(得分:0)

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

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

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

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