当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或者我不想)是约束(例如外键)违规。我让 DML 引发错误并让数据库驱动程序引发异常。捕捉到它之后,我只是通过 MySQL 的错误代码打印出一些错误消息。
问题是,即使插入失败,我看到autoincrement
序列仍在增长,增加。我怎样才能防止这种情况?
当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或者我不想)是约束(例如外键)违规。我让 DML 引发错误并让数据库驱动程序引发异常。捕捉到它之后,我只是通过 MySQL 的错误代码打印出一些错误消息。
问题是,即使插入失败,我看到autoincrement
序列仍在增长,增加。我怎样才能防止这种情况?
这就是自动递增值和序列的工作方式。当一个值被使用时,如果事务失败,它不会被回收,事务被回滚。
由于您使用的是自动增量值,因此实际值无关紧要,因此除了缺少数字的美感之外,空格应该不是问题。
我们应该在插入之前检查是否有错误,通过使用存储过程并为每个错误条件创建一个引发应用程序错误,这样当插入散文中出现错误时,我们的 auto_increment 永远不会增加。这是因为当存储过程内部发生错误时,您可以设置条件何时可以执行插入过程。当错误帐户设置信号状态 = 1 或其他东西并且当信号状态 == 1 结束时,结束存储过程并且不执行插入 stmt。它是那样的。
第二个选项是在发生错误时重置 auto_increment。
ALTER TABLE table_name AUTO_INCREMENT = ?
但是我们需要知道 last_id 来设置 auto_increment,如果你不需要知道 last_id 值有 auto_increment 设置等于 1,MySQL 将设置下一个 auto_increment 等于记录的最大键 + 1。
假设在您的数据库中最大 id 为 7,然后您尝试插入两条新记录,但它们都返回错误,然后 auto_increment 将增加并变为 10。然后您执行ALTER TABLE table_name AUTO_INCREMENT = 1;auto_increment 将回到 8。
这两种方法都是在发生错误时控制 auto_increment 值的方法,当然,在应用层插入数据库之前,我们应该在验证步骤中处理它,所以当插入数据库时,如果我们在应用层小心处理,应该不会有任何错误。
您可能必须将 innodb_autoinc_lock_mode 设置为 0 或 2。