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进阶14--标识列(自增序列/auto_increment)--设置/展示步长--设置/删除标示列
mysql 约束条件 auto_increment 自动增长目录
更新 MySQL 数据库中所有表的 AUTO_INCREMENT 值