MySQL AUTO_INCREMENT 设置一直未设置

Posted

技术标签:

【中文标题】MySQL AUTO_INCREMENT 设置一直未设置【英文标题】:MySQL AUTO_INCREMENT setting keeps being unset 【发布时间】:2021-04-11 14:30:42 【问题描述】:

我的日志中偶尔会出现此错误:

WordPress database error Duplicate entry '0' for key 'order_items.id' for query INSERT INTO `order_items` (`client_id`...

如果我查看 phpMyAdmin 中的表格,ID 字段上的 AUTO_INCREMENT 设置已取消设置。所以我重新打开它,但几天后它会再次发生(在同一张桌子上多次成功操作之后)。

这也发生在其他表上。这可能是什么原因造成的?

---编辑---

我唯一能想到的是创建表的插件会时不时地重新启动。代码如下:

  $sql = "CREATE TABLE `product_feeds` (
  `id` mediumint(9) NOT NULL,
  `client_id` tinytext COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `feed_type` int(11) NOT NULL DEFAULT '1'
  `last_updated` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;";
  dbDelta( $sql );
  $sql = "ALTER TABLE `product_feeds`  ADD PRIMARY KEY `id` (`id`);";
  dbDelta( $sql );
  $sql = "ALTER TABLE `product_feeds`  MODIFY `id` mediumint(9) NOT NULL AUTO_INCREMENT;";
  dbDelta( $sql );

最后一行是添加 AUTO_INCREMENT 的行。这是正确的陈述顺序吗?

【问题讨论】:

该字段的数据类型是什么? @AkhileshBChandran mediumint 设置/取消设置是什么意思? AUTO_INCREMENT 从列定义中消失了? @ysth 这是正确的 这不只是发生。你正在运行的东西正在改变表或创建新表。 【参考方案1】:

我同意上面的 cmets,列不会自发丢失其 AUTO_INCREMENT 选项。仅当有人运行 ALTER TABLE 来修改列并省略 AUTO_INCREMENT 关键字时才会发生这种情况。

演示:

mysql> create table mytable (id int auto_increment primary key);
Query OK, 0 rows affected (0.05 sec)

mysql> show create table mytable\G

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

到此为止……

mysql> alter table mytable modify column id mediumint;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table mytable\G

CREATE TABLE `mytable` (
  `id` mediumint(9) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

快! AUTO_INCREMENT 选项不见了!

如果修改列,则必须重复整个列定义,包括数据类型、默认值、NOT NULL 和 yes、AUTO_INCREMENT 等选项,否则这些选项将被删除。

现在你必须弄清楚谁在运行 ALTER TABLE。

【讨论】:

谢谢。我刚刚粘贴了我的表创建语句。那里的最后一条语句添加了 AUTO_INCREMENT。 除了插件初始化代码之外的其他东西必须运行另一个 ALTER TABLE,因为如果所有三个语句都运行,您显示的语句应该导致一个自动增量列。我不确定为什么它们被分成三个语句——我会在 CREATE TABLE 中完成所有这些。 我已经在整个代码库中搜索了另一个 ALTER 语句,但没有。我将尝试将语句移到一个中(以前的开发人员出于某种原因这样做了) 你启用了二进制日志吗?您可以将其转储为可读格式并搜索该表的创建/更改语句。见dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html

以上是关于MySQL AUTO_INCREMENT 设置一直未设置的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础之 AUTO_INCREMENT

MySQL进阶14--标识列(自增序列/auto_increment)--设置/展示步长--设置/删除标示列

mysql 约束条件 auto_increment 自动增长目录

更新 MySQL 数据库中所有表的 AUTO_INCREMENT 值

mysql AUTO_INCREMENT 能设置区间吗?即有一个自增最小值和最大值,最大值自己指定不是该类型的最大值

Mysql数据库之auto_increment