【问题标题】:SQLAlchemy autoincrement not inserting correctlySQLAlchemy 自动增量未正确插入
【发布时间】:2022-01-03 20:07:07
【问题描述】:

我创建了一个带有自动增量 id 的客户表,问题是在 id:5 之后它插入了 151、152、153……这是怎么回事?有没有办法解决这个问题?

【问题讨论】:

  • 可能和这个Auto Increment skipping numbers?有同样的问题。我不知道他们是否改变了自动增量的行为。 (有关 SO 的更多结果,请参阅this)
  • 好吧,让我看看吧。
  • 它是可复制的,看这个DBFIDDLE
  • 您是否一直在删除记录?
  • @Peter 不,我没有。

标签: python mysql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

至少有五种可能发生这种情况。

  1. 有人故意插入了 id=150 的行。这会自动推进表的下一个自动增量。 IE。自动增量不会生成小于表中最大 id 的值。

  2. 有 145 次插入失败。默认情况下,InnoDB 分配下一个 auto-inc 值,然后尝试 INSERT。但如果 INSERT 失败,它不会“撤消” auto-inc。因此,如果您有很多失败的 INSERT 行尝试,例如,如果它们违反了其他表约束,那么您“丢失”了 auto-inc 值。它们是分配的,但不是连续使用的。

  3. 一些行被插入了 6 到 150 之间的值,然后被删除。

  4. InnoDB 自发地“跳过”了一些值。这可能发生。自增必须生成唯一值,但不保证生成连续值。

  5. auto_increment_increment 暂时设置为 145,然后重置为默认值 1。这不是偶然发生的,而是故意的。

【讨论】:

  • 有什么办法可以避免这种情况吗?
  • 为什么需要?
  • 实际上,我必须为每个客户生成一个唯一的 ID,所以我选择最后一个 ID,然后将其添加到一个唯一的客户 ID,如 CS5、CS6 ...
  • 还有客户点名,所以有人会注意到没有客户 CS6 到 CS150?
  • 那么不要使用内置的自动增量功能来生成客户ID。使用其他解决方案连续生成它们。
猜你喜欢
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
相关资源
最近更新 更多