1

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

5 回答 5

6

MySQL 文档:

如果用户在 INSERT 中为 AUTO_INCREMENT 列指定 NULL 或 0,InnoDB 会将该行视为没有指定该值并为其生成一个新值。

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

从 MySQL 5.0.3 开始,InnoDB 在 CREATE TABLE 和 ALTER TABLE 语句中支持 AUTO_INCREMENT = N 表选项,以设置初始计数器值或更改当前计数器值。由于本节前面讨论的原因,服务器重新启动会取消此选项的效果。

于 2009-10-16T15:01:53.277 回答
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作第一个自动增量值。所以回答这个问题:,这是不可能的,但它不依赖于存储引擎。

于 2009-10-16T14:59:12.160 回答
2

这在 InnoDB 和 MyISAM 中都有效,第二个插入1不是 a 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)
于 2013-04-30T02:11:31.483 回答
1

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?

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

蒂姆

于 2012-11-23T22:17:26.887 回答
0

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

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

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

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

于 2009-10-16T15:13:12.423 回答