【问题标题】:Why auto_incremnt column increment it value after insert statement failed [duplicate]为什么插入语句失败后auto_incremnt列会增加它的值[重复]
【发布时间】:2013-12-16 10:25:48
【问题描述】:

我正在使用 MySQL。我创建了两个新表。 在 Employees 表中插入新行后,我故意尝试在 Orders 表中插入一个新行,其引用在 Employees 表中不存在(i知道它会产生错误)。之后,当我尝试在 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;

【问题讨论】:

  • 没有时间验证我的声明,所以它只是一个评论。但我的猜测是因为 InnoDB 支持事务并完全填充 ACID 范式和 auto_incremenet 值的唯一性,所以即使没有事务或没有其他事务在运行,也不还原 auto_increment 是最安全的方法。

标签: mysql auto-increment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当您设置自动递增表的列时。为下一个索引维护了一个统计信息。这将生成下一个 id 并再次递增并存储下一个索引以进入下一个插入。

    因此,当您尝试使用外键插入时,它几乎必须插入并增加下一个索引,但由于您对外键的约束,它将作为删除的最后一行执行。

    这会发生,就像您正在删除最后一行,然后插入新行将增加,即使您删除了最后一行。

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 2011-02-16
      • 1970-01-01
      • 2017-12-09
      • 2012-09-28
      • 2021-03-04
      • 2014-11-17
      • 2015-10-27
      相关资源
      最近更新 更多