java - 即使存在约束违规异常,主键也会自动递增 Mysql(5.6.34)

标签 java mysql sql sql-server hibernate

我创建了一个表用户,其中包含以下详细信息

  {
       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/

相关文章:

mysql - 子查询返回多于 1 行

mysql - OCaml 的数据库绑定(bind)?

java - 无法使用 PHP 运行 shell 函数

java - 将对象数组从 Angular 发送到 Spring

mysql - 通过 Shell 更新 Root 密码

php - 检查数据库中是否存在 IP(通过 $_SERVER 发送)?

sql - 如何在 SQL Server 中进行 10% 45% 45% 拆分

java - Axis 2 客户端未收到 Axis 2 Web 服务抛出的异常

java - 为什么 == 在 Integer 检查值而不是 java 中的引用时,情况与 new 运算符不同

mysql - 如何使用play框架在scala中的数据库中插入主键值?