MySQL自动增量值设置为零

Posted

技术标签:

【中文标题】MySQL自动增量值设置为零【英文标题】:MySQL auto increment value set to zero 【发布时间】:2017-09-16 20:45:33 【问题描述】:

这是一张桌子

CREATE TABLE `mytable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `val` char(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY (val)
) ENGINE=InnoDB DEFAULT CHARSET=ascii;

知道为什么会这样,我希望它在第一个查询本身中将 id 设置为零

MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 1 row affected (0.01 sec)

MariaDB > select * from mytable;
+----+-------+
| id | val |
+----+-------+
|  1 |       |
+----+-------+
1 row in set (0.00 sec)

MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 2 rows affected (0.01 sec)

MariaDB > select * from mytable;
+----+-------+
| id | val |
+----+-------+
|  0 |       |
+----+-------+
1 row in set (0.00 sec)

MariaDB > insert into mytable set id=0, val="" on duplicate key update id=0, val=val;
Query OK, 0 rows affected (0.01 sec)

任何解释将不胜感激。

更新:我知道使用 AUTO_INCREMENT=0,但这里真正的问题是查询明确设置了 id=0,那么为什么在第一个查询中将其设置为 1。在重复实例中将其设置为 0 似乎 mysql 可以。

谢谢

【问题讨论】:

是顺序输出吗? 没错。 你能不能试试,截断表,将 auto_increment 设置为 0。并用***.com/a/15821543/410439 确认。然后再次执行上述步骤。 【参考方案1】:

关于 NO_AUTO_VALUE_ON_ZERO 的答案是正确的,虽然有点不完整。 sql_mode 有一个选项允许在自动增量字段中输入显式值零。默认情况下,0 被视为与 null 相同。如果添加 NO_AUTO_VALUE_ON_ZERO 选项,则可以在该字段中指定零值。我的 cnf 文件中有这个: sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

【讨论】:

【参考方案2】:

请检查NO_AUTO_VALUE_ON_ZERO 选项。

默认情况下,auto_increment 列不能插入零值。

如果您将 NO_AUTO_VALUE_ON_ZERO 设置为 on,您可以强制输入 auto_increment 列零值。

【讨论】:

【参考方案3】:

插入新记录时,将AUTO_INCREMENT 列设置为0 意味着“为该列生成一个新值”(ref)。 AUTO_INCREMENT 列的值从 1 开始。因此:

insert into mytable set id=0, val="" on duplicate key update id=0, val=val;

相当于:

insert into mytable set id=1, val="";

您调用的第二次插入将创建一个重复键(对于 val 字段,不是 id 字段)。这会导致运行update 语句,从而将id 更新为零。出现“受影响的 2 行”消息是因为 on duplicate key update 语句在更新现有行的情况下返回 2 (ref)。

第三个insert 什么都不做。两个键都是重复的,但不需要更新现有行,因为它的值已经是您期望的值。在这种情况下,on duplicate key update 语句返回“0 行受影响”。

【讨论】:

【参考方案4】:

默认情况下,AUTO_INCREMENT 的起始值为 1,每增加一条新记录,它就会增加 1。 要让 AUTO_INCREMENT 序列以另一个值开始,请使用以下 SQL 语句:

ALTER TABLE myTabel AUTO_INCREMENT=0;

Credits

【讨论】:

我知道。但是,问题是查询明确设置id=0,那为什么要设置1。 你应该在编辑之前的原始问题中说过

以上是关于MySQL自动增量值设置为零的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中,如何在 INSERT 时使用另一列中的自动增量值?

mysql 重置当前的自动增量值

C#获取mysql自动增量值[重复]

sqlalchemy自动增量值作为外键mysql

如何使用 PDO 在 MySQL 中找到下一个自动增量值? [复制]

即使由于错误导致插入失败,MySQL 自动增量值也会增加