2016-05-12 78 views
0

我有一個包含ID值小於20,000,000的數字的行的表。該表結構如下:在表中插入行而不影響MariaDB中的AUTO_INCREMENT

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

您是否考慮過不使用AUTO_INCREMENT? –

回答

2

MySQL和MariaDB的實際執行限制AUTO_INCREMENT> MAX(ID)

ALTER TABLE Syntax

您可以將計數器不重置爲小於或等於當前正在使用的值。對於InnoDB和MyISAM,如果該值小於或等於當前AUTO_INCREMENT列中的最大值,則將該值重置爲當前最大AUTO_INCREMENT列值加1。

您可以使用ALTER TABLE到AUTO_INCREMENT設置爲MAX(ID),如果你想存儲高值高的任何值,但是你不能將其設置爲較低的值比目前的行之一在桌子裏。

如果您需要在「間隙」中創建行數小於AUTO_INCREMENT值的ID,則需要在INSERT中明確指定ID值。但是,如果超出您的控制範圍的進程插入行並且未指定ID,那麼它們總是會獲取比表中當前所有內容更高的ID。

我可以建議的唯一的事情是,如果你能夠調整什麼ID用於什麼,是你爲你的目的保留低ID(所以使用,比如1到10,000而不是50,000,000到50,009,999),設置將AUTO_INCREMENT設置爲10,001,然後讓外部進程使用更高的ID - 如果您沒有耗盡空間,這將工作得很好。

對於更長期的解決方案,請考慮切換到UUIDs - 儘管您需要修改超出此控制範圍的過程。

1

您可以將AUTO_INCREMENT設置爲任意值請您:

ALTER TABLE records AUTO_INCREMENT = ? 

雖然我強烈建議在高ID號埋葬記錄。通常越低越好,或者將它們與常規記錄混合。對這些事情的迷戀會導致後來發生衝突,當時你的假設最終會被誤解。

+0

我嘗試在插入具有非常大ID的記錄後執行ALTER TABLE ...,但它不會更改該值。順便說一句,感謝您的回答 –

+1

它曾經是'AUTO_INCREMENT'設置在某些情況下會重置爲'MAX(id)'的情況,所以您可能會在這裏打一場艱苦的戰鬥。這就是爲什麼我建議不要過分強迫它。 – tadman