2013-07-01 24 views
1

簡版:我可以通過編程方式更新表上的auto_increment值嗎?我試圖通過mysql init_file來做到這一點,所以它在啓動時發生,但我沒有看到它的工作。更新InnoDB表中的auto_increment值

USE theDb; 

SELECT max(maxid) FROM (SELECT max(RegistrationId)+1 maxid FROM Registration 
UNION 
SELECT max(RegistrationId)+1 maxid FROM RegistrationArchive) t into @maxId; 

ALTER TABLE Registration [email protected]; 

加長版: 我有InnoDB表MySQL數據庫。一個表(持有註冊信息)有一個自動增量列,當一行被處理時,它被複制到第二個存檔表並從第一個表中刪除。歸檔表沒有自動增量列。 (順便說一下,不是我的設計...)

問題是,當數據庫由於某種原因(很少發生)重新啓動時,第一個表會重新計算下一個增量值 - InnoDB的一個功能。該表通常爲空或非常小,計算出的下一個增量將對應於已經使用且位於歸檔表中的ID。數據被移動到歸檔正常,但隨後的過程不能正常工作。

+0

目前的自動遞增存儲在'information_schema.tables.auto_increment'。但我認爲你的SQL只是更新了這個值,所以如果一個不起作用,另一個可能不會。但你可以試試看。 – Barmar

+0

我能夠直接在代碼中執行此操作,但仍未使用init_file。我可以忍受這一點。至少在代碼中,版本控制已經到位。 – eflat

+0

聽起來像這樣的問題是,在初始化文件執行後重置自動增量。 – Barmar

回答

0

我知道這是晚了,但在詢問this related question後,我發現sql語句的某些部分需要是文字,不能由user_defined_variables替換。如果您需要更改SQL語句的這些部分,則需要使用prepared statements

所以,你需要做這樣的事情:

SET @`stmt_alter` := CONCAT('ALTER TABLE `Registration` AUTO_INCREMENT = ', @`maxId`); 
PREPARE `stmt` FROM @`stmt_alter`; 
EXECUTE `stmt`; 
DEALLOCATE PREPARE `stmt`;