【问题标题】:Insert rows in table without affecting AUTO_INCREMENT in MariaDB在表中插入行而不影响 MariaDB 中的 AUTO_INCREMENT
【发布时间】:2016-09-08 22:48:32
【问题描述】:

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

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

我无法控制的系统会在此表中插入行,并且数据库会使用生成的 ID 插入这些记录。

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

进行一些测试后,我意识到当我插入具有非常 vig 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 的记录不会与表的 AUTO_INCREMENT 值混淆?

PS。我正在使用 MariaDB 10。

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

【问题讨论】:

  • 你考虑过不使用AUTO_INCREMENT吗?

标签: mysql sql mariadb dml


【解决方案1】:

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

ALTER TABLE Syntax

您不能将计数器重置为小于或等于当前使用的值。对于 InnoDB 和 MyISAM,如果该值小于或等于 AUTO_INCREMENT 列中当前的最大值,则将该值重置为当前最大 AUTO_INCREMENT 列值加一。

如果您想存储更高的值,您可以使用 ALTER TABLE 将 AUTO_INCREMENT 设置为高于 MAX(id) 的任何值,但是您不能将其设置为低于其中之一的值当前在表中的行。

如果您需要在 ID 低于 AUTO_INCREMENT 值的“间隙”中创建行,则需要在 INSERT 中明确指定 id 值。但是,如果您无法控制的进程正在插入行而不指定 ID,那么它们总是会获得比表中当前所有其他内容更高的 ID。

我唯一可以建议的是,如果您能够调整哪些 ID 用于什么用途,请为您的目的保留低 ID(例如,使用 1 到 10,000 而不是 50,000,000 到 50,009,999),设置AUTO_INCREMENT 到 10,001,然后让外部进程使用更高的 ID - 只要您没有空间不足,这将工作得很好。

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

【讨论】:

    【解决方案2】:

    您可以将AUTO_INCREMENT 设置为任意值:

    ALTER TABLE records AUTO_INCREMENT = ?
    

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

    【讨论】:

    • 在插入具有非常大 ID 的记录后,我尝试执行 ALTER TABLE ...,但它不会更改值。顺便说一句,谢谢你的回答
    • 过去在某些情况下AUTO_INCREMENT 设置会重置为MAX(id),因此您可能会在这里进行一场艰苦的战斗。这就是为什么我建议不要强迫它太远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多