nodejs连接mysql执行insert操作遇到唯一约束字段冲突的问题

nodejs连接mysql执行insert操作,
遇到unique冲突(某些字段设置了约束)
image.png

image.png

image.png

sql: insert into user (username, password, name, department, status, c_time, u_time) values (省略对应value)

问题

数据并没有插入进去,但主键id却自增了(下一次插入发现之前冲突的插入行为依然导致主键id自增),实际上并不希望其在insert失败的时候主键自增,请问这种问题怎么解决呀。

阅读 2.4k
1 个回答

AUTO_INCREMENT Handling in InnoDB:

  • “Lost” auto-increment values and sequence gaps

In all lock modes (0, 1, and 2), if a transaction that generated auto-increment values rolls back, those auto-increment values are “lost”. Once a value is generated for an auto-increment column, it cannot be rolled back, whether or not the “INSERT-like” statement is completed, and whether or not the containing transaction is rolled back. Such lost values are not reused. Thus, there may be gaps in the values stored in an AUTO_INCREMENT column of a table.

InnoDB 关于 auto increment 的文档明确说明了,失败的 insert 会引起 auto incrment 列增加。这是一个不可更改的行为。

这应该是因为 InnoDB 要处理并发的 transacation。考虑如果发生了下面的一系列事件:

  • insert 1 开始
  • insert 2 开始
  • insert 1 失败了 ...

显然在 insert 1 失败的时候,已经没有机会回滚 auto increment 值了,此时“更新的” auto increment 值已经被 insert 2 占用了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题