文章目录
- 问题示例
- 引用官方
- 注意总结
问题示例
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
如上报错发生在,MySQL 5.7 版本,对表字段(varchar)长度进行更改。
表结构如下:
CREATE TABLE `t1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`c1` varchar(10) NOT NULL,
`c2` varchar(20) NOT NULL,
`c3` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_c123` (`c1`,`c2`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4
DDL SQL 如下:
ALTER TABLE t1 MODIFY COLUMN C1 varchar(100) NOT NULL,ALGORITHM=INPLACE, LOCK=NONE;
引用官方
注意总结
总结更改 varchar 列长度的限制如下:
- 从 0 到 255 字节的更改:可以在 inplace 进行。因为这种情况下,长度字节的数量(1个)不会改变。
- 从 256 字节或更多到更大的更改:同样可以 inplace 进行,因为长度字节的数量(2个)也不会改变。
- 从小于 256 字节到 256 字节或更多的更改:这不能通过 inplace 进行,因为长度字节的数量会从 1 个变为 2 个。这种更改需要复制整个表(需要使用 ALGORITHM=COPY ),因为需要额外的空间来存储新的长度字节。
- 减少长度的更改,同样不支持 inplace 。
在对 varchar 列进行长度更改时,需注意上述问题限制,避免执行过程因为锁表对业务产生影响,以及执行指定 inplace 算法出现报错时的问题排查。