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

时间:2016-05-12 21:57:43

标签: mysql sql mariadb dml

我有一个包含一堆行的表,其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)。此外,重要的是要注意不受控制的系统插入少量记录,这样我要插入的记录永远不会与不受控制的系统的记录发生碰撞。

进行一些测试我意识到当我插入一个带有非常强烈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。

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

2 个答案:

答案 0 :(得分:2)

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

请参阅ALTER TABLE Syntax

  

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

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

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

我唯一可以建议,如果你能够调整用于什么的ID,那就是为你的目的保留低ID(所以使用,比如1到10,000而不是50,000,000到50,009,999),设置AUTO_INCREMENT到10,001,然后让外部进程使用更高的ID - 如果没有空间不足,这可以正常工作。

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

答案 1 :(得分:1)

您可以将AUTO_INCREMENT设置为您想要的任何值:

ALTER TABLE records AUTO_INCREMENT = ?

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