我正在使用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 - 当我选择了不正确的锁定级别时,我希望正确的错误告诉我。
答案 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...
的内容,这是你提示而不是引用的术语是开头的错误,而是解析器/词法分析器期望除了引用值之外的某些内容(因为它正在寻找逗号)。
如果要更改的列是主键,则锁似乎是不可避免的 - 因为整个表应该需要重建,包括所有索引,因为主键在所有索引中“免费”,因为它是使用的在非覆盖索引查找之后,实际找到与索引匹配的行。