2015-12-31 132 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...这是你的提示而不是表示引用的术语是错误的开始,而是说解析器/词法分析器预计的东西以外的引用值发生在该位置(因为它在寻找逗号)。

如果您正在修改的列是主键,那么锁看起来是不可避免的 - 因为整个表需要重建,包括所有索引,因为主键在所有索引中“免费”,因为它是什么在非覆盖索引查找后用于实际查找索引匹配的行。