2015-12-31 120 views
1

我正在使用MariaDB 10.1.9。 簡短版本:我真的很想知道的是,如果我可以修改innodb表上的索引auto_increment字段從int到bigint而不鎖定表嗎?mariadb alter table lock strategy

長版本:有沒有詳細說明哪些ALTER TABLE操作需要哪個鎖定級別?該文檔只是說「根據所需的操作和使用的存儲引擎,不同的鎖定策略可以用於ALTER TABLE。」。它不提供指向任何細節的鏈接,並且ALTER TABLE頁面上的每個操作都沒有指定它的所需級別。

從實驗中,我知道ADD COLUMN不需要鎖定。 MODIFY COLUMN允許讀取,但可以手動設置以允許寫入? MariaDB documentation表示你可以設置鎖定級別,但是如果你沒有設置足夠的限制,它會給出一個錯誤 - 但它沒有說明錯誤是什麼。當前的表列定義看起來像

`Id` int(10) NOT NULL AUTO_INCREMENT 
KEY `Id` (`Id`) 

當我嘗試

ALTER TABLE MyTable MODIFY MyField bigint AUTO_INCREMENT LOCK=NONE; 

我只是得到一個通用的SQL語法錯誤。即使我指定了DEFAULT,我也會得到一個錯誤,所以我不知道如何使用LOCK--當我選擇了一個不正確的鎖定級別時,我希望正確的錯誤告訴我。

回答

2

語法...

alter_specification [, alter_specification] ... 

...需要一個逗號

ALTER TABLE MyTable 
    MODIFY COLUMN MyField BIGINT AUTO_INCREMENT, -- comma here 
    LOCK=NONE; 

我猜的錯誤是不是所有的「通用」 - 它應該說什麼the right syntax to use near 'LOCK...這是你的提示而不是表示引用的術語是錯誤的開始,而是說解析器/詞法分析器預計的東西以外的引用值發生在該位置(因爲它在尋找逗號)。

如果您正在修改的列是主鍵,那麼鎖看起來是不可避免的 - 因爲整個表需要重建,包括所有索引,因爲主鍵在所有索引中「免費」,因爲它是什麼在非覆蓋索引查找後用於實際查找索引匹配的行。