做什么呢?
ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL
锁定整张表格?
做什么呢?
ALTER TABLE sample ADD COLUMN `hasItem` tinyint(1) DEFAULT NULL
锁定整张表格?
简短回答:在 MySQL < 5.6 版本中需要锁。从 5.6 版本开始,并且使用 InnoDB 引擎,许多 ALTER TABLE
操作(包括添加列)不需要锁定。
如果您使用的是MySQL 5.5或更早版本,则它将为整个操作获取读锁,然后在最后获取短暂的写锁。
在大多数情况下,ALTER TABLE会创建原始表的临时副本... 在执行ALTER TABLE时,其他会话可以读取原始表(除了稍后注意到的例外)。开始于ALTER TABLE操作之后的对表格的更新和写入将被暂停,直到新表准备就绪...
前面提到的例外是ALTER TABLE在准备安装新版本的表.frm文件、丢弃旧文件并从表和表定义缓存中清除过时的表结构时阻止读取(不仅仅是写入)。此时,它必须获得独占锁。
也就是说,在添加列时,它会为大部分操作读锁定表,然后在最后获取写锁。
ALTER TABLE
语句中设置ALGORITHM=inplace
和LOCK=none
。在MySQL 5.6之前创建的InnoDB表不支持包含时间列(DATE、DATETIME或TIMESTAMP)且未使用ALTER TABLE ... ALGORITHM=COPY重建的表的ALTER TABLE ... ALGORITHM=INPLACE。