我有一个包含一堆行的表,其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。
编辑:我更改了数字,但问题是一样的。
答案 0 :(得分:2)
MySQL和MariaDB实际上强制执行限制AUTO_INCREMENT> MAX(ID)
您无法将计数器重置为小于或等于当前正在使用的值的值。对于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 = ?
虽然我强烈建议在高身份证号码下埋葬记录。通常更低更好,或者只是将它们与常规记录混合在一起。当你的假设最终被误解时,对这些事情的执着会导致冲突。