mariadb alter table lock strategy

时间:2015-12-31 20:21:03

标签: mysql mariadb

我正在使用MariaDB 10.1.9。 短版:我真的想知道的是,如果我可以修改innodb表上的索引auto_increment字段,从int到bigint而不锁定表吗?

长版本:是否详细解释了哪个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 - 当我选择了不正确的锁定级别时,我希望正确的错误告诉我。

1 个答案:

答案 0 :(得分: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...的内容,这是你提示而不是引用的术语是开头的错误,而是解析器/词法分析器期望除了引用值之外的某些内容(因为它正在寻找逗号)。

如果要更改的列是主键,则锁似乎是不可避免的 - 因为整个表应该需要重建,包括所有索引,因为主键在所有索引中“免费”,因为它是使用的在非覆盖索引查找之后,实际找到与索引匹配的行。