【问题标题】:Auto increment value left behind / lower than actual values自动增量值落后/低于实际值
【发布时间】:2018-08-27 08:46:32
【问题描述】:

是否有可能在某个时候,表的 ID 高于当前的 AUTO_INCREMENT 值?

我有一张像队列一样的桌子。我每秒插入/删除 10-30 行,需要自动递增列才能继续。当我现在插入行时,我得到一个回收的自动增量(id),例如:374097

这是表格:

CREATE TABLE `test_table` (
    `id` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
COLLATE='utf8_bin'
ENGINE=InnoDB
AUTO_INCREMENT=374098;

还有另一个表使用这个id 作为外键。

SELECT max(batch_id) from secondary_table;

返回:397959在某些时候,test_table 的 ID 最高为 397959,而 AUTO_INCREMENT 则低得多!

我在 https://dev.mysql.com/doc/refman/8.0/en/replication-features-auto-increment.html 上读到了这个,我应该是安全的 - AUTO_INCREMENT 设置在一个简单的主键上。

知道我是否可以像这样继续使用 AUTO_INCREMENT,还是需要使用自己提供的 ID?

【问题讨论】:

  • 你用的是什么版本的mysql?
  • 你应该阅读这个serverfault.com/questions/228690/…并参考你的mysql版本的手册。
  • @P.Salmon:你说得对,我把它漏掉了。它实际上是 AWS Aurora,我觉得它是最新的 MySQL 并进行了一些调整,但实际上“与 MySQL 5.7 兼容”。

标签: mysql amazon-aurora


【解决方案1】:

您可以保持自动增量:您只需将第一个表上的自动增量值更新为最大值 + 1

ALTER TABLE test_table AUTO_INCREMENT = 397959 + 1

【讨论】:

  • 我知道如何解决它,问题比这更广泛,我需要知道我正在做的事情是否正常,否则我以后可能会遇到同样的问题。
  • 使用自动增量是安全的,即使此 id 在另一个表中用作外键。问题是如何在第二个表中获得比原始自动增量更高的 foreign_id。
  • 问题恰恰相反。在 auto_increment 回滚一点之前,foreign_id 是正确的,因为当 mysql 重新启动时,ID 可能不再在表中。
  • 它必须是其他东西:是的,当然,自动增量是表中的一个组成部分:ACID principe(从 MySQL 8.0 开始)。你可以看到它:SELECT TABLE_NAME,AUTO_INCREMENT FROM information_schema.TABLES
猜你喜欢
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多