【发布时间】:2020-08-28 12:29:34
【问题描述】:
在向我的 SQL 课程的学生演示 INSERT 语句时,我们在 MySQL 8.0 中发现了一些奇怪的行为。请帮助我们了解正在发生的事情。 (不需要解决方法,因为我们知道有一些解决方法,这是用于学习,而不是用于生产。谢谢)
我们正在创建一个新数据库并从著名的Sakila 示例数据库中复制一些行,如下所示:
CREATE DATABASE simpsons;
USE simpsons;
CREATE TABLE `character` (
character_id smallint unsigned NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20),
shoe_size INT,
PRIMARY KEY (character_id));
INSERT INTO `character`
(first_name, last_name)
SELECT
first_name, last_name
FROM
sakila.actor;
当我们这样做并SELECT * FROM ``character`` 时,我们会看到来自sakila.actor 的所有200 条记录都已正确复制到新的character 表中。
最后一行的 200 自动递增 PK 的值为 character_id。输出窗口显示上述任何命令都没有错误。
然后,当我们立即手动添加一条记录时:
INSERT INTO `character`
(first_name, last_name, shoe_size)
VALUES
('Bart', 'Simpson', 35);
很奇怪,我们发现这条记录的值256 是它的character_id,而不是201。
尽管运行SHOW VARIABLES LIKE 'auto_inc%'; 表明auto_increment_increment 和auto_increment_offset 都设置为1,但这是事实。
我们想了解为什么 MySQL 会跳过 56 个数字?
请注意,这个问题与 MySQL InnoDB auto_increment value increases by 2 instead of 1. Virus? 和 MySQL autoincrement column jumps by 10- why? 不同,因为 auto_incerement_increment 是 1,在我们(易于重现)的场景中没有 DELETE 操作,我们每个人都是我们预期的唯一用户数据库。另外,对于这个问题的答案,对于实际发生的事情,没有一个是决定性的。最后,请参阅@Postman 的精彩答案,其中引用了上述问题的任何答案中未提及的根本原因。谢谢
【问题讨论】:
-
A) 谁在乎? B) 可能:被放弃的交易。 C) 要了解下一个值应该是什么,请查看
SHOW CREATE TABLE。 D) 您可以随时使用ALTER TABLE将其切换为您想要的任何内容。 -
这能回答你的问题吗? MySQL autoincrement column jumps by 10- why?
-
可以确认 MySQL 版本 8.0.20 的这种行为
-
如何重现:dbfiddle.uk/…
标签: mysql auto-increment