mysql 行自动增量为23_MySQL自动增量字段自行重置

The auto-increment counter is stored only in main memory, not on disk.

因此,当服务(或服务器)重新启动时,将发生以下情况:

After a server startup, for the first insert into a table t, InnoDB

executes the equivalent of this statement: SELECT MAX(ai_col) FROM t

FOR UPDATE;

InnoDB increments by one the value retrieved by the statement and

assigns it to the column and to the auto-increment counter for the

table. If the table is empty, InnoDB uses the value 1.

所以用简单的英语,在MySQL服务启动后,它不知道你的表的自动增量值应该是多少.因此,当您第一次插入行时,它会找到使用自动增量的字段的最大值,将此值加1,并使用结果值.如果没有行,则从1开始.

这对我们来说是一个问题,因为我们使用表和mysql的自动增量功能在多线程环境中巧妙地管理ID,用户将这些ID重新定向到第三方支付站点.因此,我们必须确保第三方获得的ID并发回给我们的ID是唯一的并且将保持这种方式(当然,用户可能会在重定向后取消该交易).

因此,我们创建了一行,获取生成的自动增量值,删除行以保持表清洁,并将值转发到付款站点.我们最终做的是解决InnoDB处理AI值的方式问题如下:

$query = "INSERT INTO transactions_counter () VALUES ();";

mysql_query($query);

$transactionId = mysql_insert_id();

$previousId = $transactionId - 1;

$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";

mysql_query($query);

这始终将最新的transactionId保存为表中的一行,而不会不必要地炸毁表.

希望能帮助其他可能遇到此问题的人.

编辑(2018-04-18):

正如下面提到的Finesse一样,它的行为似乎已经在MySQL 8.0中被修改.

该工作日志中的措辞充其量是错误的,但是现在看来InnoDB在那些较新的版本中支持重新启动时的持久autoinc值.

-Gremio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值