在 table 中插入行而不影响 MariaDB 中的 AUTO_INCREMENT

Insert rows in table without affecting AUTO_INCREMENT in MariaDB

我有一个 table 有一堆行,其 ID 是值小于 20,000,000 的数字。 table 结构如下所示:

CREATE TABLE records(
    id int(11) not null AUTO_INCREMENT,
    ... more data columns ...
) ENGINE=InnoDB AUTO_INCREMENT=16432352 DEFAULT CHARSET=utf8;

一个不受我控制的系统在此 table 中插入行,数据库插入那些具有生成 ID 的记录。

但是,我需要在此 table 中插入 ID 非常大(从 50,000,000 开始)的记录。此外,重要的是要注意不受控系统插入的记录很少,这样我要插入的记录就不会与不受控系统的记录发生冲突。

进行一些测试后,我发现当我插入一个 ID 非常大的记录时,AUTO_INCREMENT 值会跳转到那个非常大的 ID。例如:

首先,我检查 initial_auto_increment 值:

SHOW TABLE STATUS FROM my-database like 'records';

... auto_increment 值如下所示:

#    Name, ... , Auto_increment, ...
 'record', ... ,    '16432352', ...

接下来,我插入ID很大的记录。

INSERT INTO records (id, ...) VALUES(679456755, ...);

然后,再次检查 auto_increment 值:

SHOW TABLE STATUS FROM my-database like 'records';

..最终结果如下所示:

#    Name, ... , Auto_increment, ...
 'record', ... ,    '679456756', ...

我的问题是:我怎样才能暂时禁用 AUTO_ICREMENT 功能,这样我的 ID 很大的记录就不会与 [=49= 的 AUTO_INCREMENT 值混淆]?

PS。我正在使用 MariaDB 10。

编辑:我改变了数字,但问题是一样的。

您可以将 AUTO_INCREMENT 设置为您喜欢的任何值:

ALTER TABLE records AUTO_INCREMENT = ?

虽然我强烈建议将记录埋在高 ID 号处。通常越低越好,或者只是将它们与常规记录混合在一起。当你的假设最终被误解时,对这些事情的执着会导致冲突。

MySQL 和 MariaDB 实际上执行限制 AUTO_INCREMENT > MAX(id)

ALTER TABLE Syntax

You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one.

如果您想存储更高的值,您可以使用 ALTER TABLE 将 AUTO_INCREMENT 设置为任何高于 MAX(id) 的值,但是 不能 将其设置为低于 table.

中当前行之一的值

如果您需要在 "gap" 中创建 ID 低于 AUTO_INCREMENT 值的行,您需要在 INSERT 中明确指定 id 值。但是,如果您无法控制的进程正在插入行而不指定 ID,那么它们总是会获得比 table.

中当前所有其他内容更高的 ID

如果您能够调整 ID 的用途,我唯一可以建议的是,为您的目的保留低 ID(例如,使用 1 到 10,000,而不是 50,000,000 到 50,009,999),将 AUTO_INCREMENT 设置为 10,001,然后让外部进程使用更高的 ID - 如果您不从 space.

中选择 运行,这就可以正常工作

对于更长期的解决方案,请考虑切换到 UUIDs - 尽管您需要为此修改您无法控制的流程。