mysql – MariaDB – INNODB在创建增量记录时跳过数字序列 – 为什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – MariaDB – INNODB在创建增量记录时跳过数字序列 – 为什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1613字,纯文字阅读大概需要3分钟。
内容图文
![mysql – MariaDB – INNODB在创建增量记录时跳过数字序列 – 为什么?](/upload/InfoBanner/zyjiaocheng/889/3e3c8ff997dd4ed9a63b8b582b16d2c7.jpg)
我不知道这是否是INNODB的预期行为,但我认为这完全是奇怪的.
如果我使用MYISAM使用相同的SQL语句,则行为按预期发生.
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值,否则有人会认为他们想要删除的行以某种方式回来了.
内容总结
以上是互联网集市为您收集整理的mysql – MariaDB – INNODB在创建增量记录时跳过数字序列 – 为什么?全部内容,希望文章能够帮你解决mysql – MariaDB – INNODB在创建增量记录时跳过数字序列 – 为什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。