【问题标题】:INSERT INTO table DEFAULT(key_col) inserts zero?INSERT INTO table DEFAULT(key_col) 插入零?
【发布时间】:2015-11-27 06:36:10
【问题描述】:

我在tbl 中有这个主键列:

`id` INT(5) unsigned NOT NULL  AUTO_INCREMENT PRIMARY KEY

当我运行下面的查询时,会插入零而不是下一个自动递增编号:

INSERT INTO `tbl` (id, col1, ...) VALUES (DEFAULT(id), "value 1", ...)

有趣的是,这种行为是最近才出现的,这让我想知道我可能更改了什么设置导致了这种情况。

我首先考虑的是NO_AUTO_VALUE_ON_ZERO。我已经在配置文件的sql_mode中添加了这个,现在是这样的:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_VALUE_ON_ZERO 。

我知道当DEFAULT(id)被NULL替换时,自动编号按预期生成;但就像现在一样,我的应用程序生成的是前者而不是后者。

我的问题是:

  1. 是否有可能允许DEFAULT(id) 生成 下一个汽车号码?

  2. 应用程序环境中的其他哪些更改可能导致此问题?

我问这些是因为这种行为(插入零)直到最近才出现。

【问题讨论】:

  • 为什么需要DEFAULT(id)??您不能省略它,以便该字段将获得自动增量值吗?
  • 你用的是什么mysql版本?
  • @user3571366:我可以省略,但这需要对应用程序进行大量修改。如果我能避免它,那就更好了。
  • @ChetanAmeta:MySQL 版本是 5.6.23-log - MySQL 社区服务器 (GPL)
  • 我意识到这种行为会根据 SQL 选项而改变,不确定是哪一个,但insert into table values (DEFAULT) 在某些选项中插入零,并为其他选项插入 1(或下一个 AI 值)。奇怪。

标签: mysql auto-increment


【解决方案1】:

不要将 id 作为auto_increment PK 列的列提供。当你这样做时,你只是在自找麻烦。也许驱动程序在某些层上得到了更新。当你按照原来的方式做事时,麻烦就会来袭,它确实发生了。

CREATE TABLE myTable999
(   id int auto_increment primary key,
    thing varchar(100) not null,
    colC int not null
);

insert myTable999(thing,colC) values ('fish',5),('mustard',11),('gators',-12);

select * from myTable999;
+----+---------+------+
| id | thing   | colC |
+----+---------+------+
|  1 | fish    |    5 |
|  2 | mustard |   11 |
|  3 | gators  |  -12 |
+----+---------+------+

您可以遵守手册,也可以掷骰子。 Here is the Manual。看第一个例子。

【讨论】:

  • 他说来自他的应用程序。他希望保持不变并让自动增量像往常一样工作。
  • 他可以撤消所有系统更新以使他的应用程序如您所说的那样工作(使用有风险的方法)。或者他可以以正确的方式做到这一点。如果他对我的回答不满意,全额退款。
  • @Drew:我很欣赏你的回答,我知道它会很好用。但正如我已经解释过的,数据库代码是由复杂的应用程序生成的。我可以决定修改应用程序,但如果它可以工作,我不会。此外,为什么它多年来运行良好?
  • 在应用程序(我们姑且称之为 EXE)和数据库之间有很多层代码。一层改变了。既然我们说的是 EXE,那么有多少次更新对那些有效的东西做了撤销。与操作系统无关。
猜你喜欢
  • 2010-10-26
  • 2023-02-09
  • 1970-01-01
  • 2018-11-13
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多