我创建了一个表用户,其中包含以下详细信息
{
id , //autoincrment
name
}
和具有外键关系的用户的表帐户
Account {
id , //autoincrement
userid //foreign key reference to user
}
当我插入用户表中不存在的值 userId 的帐户时 我收到约束破坏异常
Cannot add or update a child row: a foreign key constraint fails (`schema`.`account`, CONSTRAINT `constraint_name` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`))
但是我的帐户自动增量计数增加了。
我的意思是在异常帐户表的最大 ID 为 100 之前。 当我插入新记录时,它会因上述异常而失败。我更正了查询并使用正确的用户 ID 插入,然后我看到 accountid 值为 102。
这是 mysql 的正确行为吗?即使查询执行失败,它是否应该增加自动增量值?
最佳答案
auto_increment 在事务范围之外工作(就像 Oracle 等其他数据库系统中的序列一样),这是有意且正确的。原因是两个不同的事务不能得出相同的数字,否则在表的关键列这样的神经痛点上加锁会对并发情况产生巨大的性能影响。
比照。还有这个SO answer .
关于java - 即使存在约束违规异常,主键也会自动递增 Mysql(5.6.34),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44429298/