mysql - MariaDB - INNODB 在创建增量记录时跳过数字序列 - 为什么?
问题描述
我不知道这是否是预期的行为INNODB
,但我真的认为这很奇怪。
如果我使用相同的 SQL 语句 using MYISAM
,则行为会按预期发生。
米萨姆
CREATE TABLE main_database.numero (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
) ENGINE = MYISAM DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
INSERT INTO main_database.numero VALUES(NULL); -- First, run once time ...
INSERT INTO main_database.numero SELECT NULL FROM main_database.numero; -- After, more 12 times = 4096 records
结果(预期行为):
但是,现在如果我使用完全相同的语句,通知引擎是INNODB
.
INNODB
CREATE TABLE main_database.numero (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
INSERT INTO main_database.numero VALUES(NULL); -- First, run once time ...
INSERT INTO main_database.numero SELECT NULL FROM main_database.numero; -- After, more 12 times = 4096 records
结果(奇怪的结果 - 跳过数字序列):
事实上,这两个引擎都在创建预期的 4096 条记录,但我对 的行为感到担心INNO
,因为我正在将我的数据库从 迁移MYISAM
到INNODB
并且我不知道这会对我的应用程序产生多大影响。
解决方案
需要 auto_increment 机制来生成唯一值,这些值大于它之前生成的任何值。它不保证生成连续值。
这里有一些讨论:https ://bugs.mysql.com/bug.php?id=57643
忠实地生成连续值并不重要,因为任何值都可能由于其他原因“丢失”:
- 您的 INSERT 失败,例如因为违反了 UNIQUE KEY 或 FOREIGN KEY 等约束。
- 您为您的 INSERT 回滚事务。
- 您成功并提交,但后来该行被您或其他会话删除。
Auto-inc 值不会返回到任何类型的队列,因为其他并发会话可能同时生成了更多的 id 值。InnoDB 维护一个未分配的 id 值池是不值得的,因为该池可能变得巨大且浪费。
此外,“丢失”一个 ID 值可能是合适的,否则有人会认为他们打算删除的行不知何故又回来了。
推荐阅读
- python - 如何设置keras LSTM的输入形状
- git - gitignore 中路径/文件结尾注释的区别
- mysql - 如何计算出现在列中特定字母之后的字母?
- ios - 在 iOS 如何处理 EXC_RESOURCE RESOURCE_TYPE_MEMORY 错误?
- html - 如何遮盖需要可点击的 div?
- node.js - 如何修复快速路由的空结果?
- azure - 使用 API 从 NetSuite 文件柜下载文件
- html - 相对/响应位置
在 svg 中?可能吗? - graphql - Nestjs azure 活动目录和 graphql - UseGuard
- python - 在计算列表项时查找重复