我想向现有表添加列。
有没有办法在不锁定表的情况下更改表?
不,那不可能。
但是,添加可为空列或具有常量(不可变)默认值的非空列仅仅是目录更改,并且只需要很短的时间(如果可以获得锁,通常为“毫秒”)。但那段时间,独占锁是无法避免的。
在Mariadb中,有Alter Locking Strategy,其中讨论了如何锁定DDL语句。
InnoDB 支持多种锁定策略来执行 DDL 操作。与以前的版本相比,这提供了显着的性能改进。支持的锁定策略是:
- DEFAULT - 这意味着特定操作的默认行为。
- 无
- 分享
- 独家
无论使用哪种锁定策略来执行DDL操作,InnoDB都必须在操作执行开始和结束时对表进行短暂的独占锁定。这意味着必须提交或中止任何可能访问该表的活动事务才能继续操作。这适用于大多数 DDL 语句,例如 ALTER TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE、RENAME TABLE 等。
所以,简单来说,使用
LOCK=NONE
:
ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;