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 时使用另一列中的自动增量值?