我正在使用MySQL。我创建了两个新表。 在 Employees 表中插入新行后,我故意尝试在订单表中插入一个新行,其中员工表中不存在该行(i知道它会产生错误)。之后当我尝试在订单表中插入一个新行时,它在员工表中存在,它成功执行但现在第一行 订单表的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;
答案 0 :(得分:3)
AUTO_INCREMENT仅保证下一个值将大于前一个值,但不保证数字中没有间隙。
这背后有性能原因。 AUTO_INCREMENT后面有一个隐藏的计数器,用于存储实际值。这样,序列不具有在分布式事务环境中可能相当大的事务开销。 除了db可以一次从磁盘中预取更多的值到内存中,大大降低了所需的磁盘数量。
答案 1 :(得分:1)
将自动增量设置为表格的列时。有一个统计数据是为下一个索引维护的。这将生成下一个id并再次递增并存储下一个插入的下一个索引。
因此,当您尝试使用外键插入时,它几乎必须插入并且下一个索引递增,但是通过您的外键约束,它将作为删除的最后一行执行。
这将发生,就像您要删除最后一行,然后插入新行将增加,即使您删除最后一行。