mysql - 为什么 auto_incremnt 列在插入语句失败后增加它的值

标签 mysql auto-increment

<分区>

我正在使用 MySQL。我创建了两个新表。 在 Employees 表中插入一个新行后,我故意尝试在 Orders 表中插入一个新行,其引用在 Employees 表中不存在(我知道它会产生错误)。之后,当我尝试在 Orders 表中插入一个新行时,其引用存在于 Employees 表中,它执行成功但现在第一行 Orders 表的 id 为 2。为什么即使第一个插入语句失败它也会增加

CREATE TABLE Employees
(
EmpID SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmpFN VARCHAR(20) NOT NULL 
)
ENGINE=INNODB;

CREATE TABLE Orders
(
OrderID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   
EmpID SMALLINT NOT NULL,
FOREIGN KEY (EmpID) REFERENCES Employees (EmpID)
)
ENGINE=INNODB;

最佳答案

AUTO_INCREMENT 只保证下一个值会比前一个大,但不保证数字之间没有差距。

这背后有性能原因。 AUTO_INCREMENT 后面有一个隐藏的计数器,它存储实际值。这样,序列就没有在分布式事务环境中相当大的事务开销。 除了 db 可以一次从磁盘预取更多值到它的内存中,这显着降低了所需的磁盘 io。

关于mysql - 为什么 auto_incremnt 列在插入语句失败后增加它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20299047/

相关文章:

mysql - 创建虚拟表以与现有表连接?

mysql - Mariadb/MySQL 在比较 TimeStamp 时的区别

mysql - mysql中autoincrement能产生的最大ID号是多少

mysql - SQL LOAD DATA INFILE 问题

mysql - 奇怪的SQL结果order by date, count(date)

php - 在不提供链接标识符的情况下查询数据库是不好的做法吗?

postgresql - 在 PostgreSQL 中生成自动递增主键的可接受方法是什么?

mysql - 如何将自动递增的主键也用作外键?

sql - TSQL 更新时自动增量

mysql - rake db :migrate - Rake aborted! 访问被拒绝