在 MySQL 中删除 AUTO_INCREMENT 是否会重建表?

在 MySQL 中删除 AUTO_INCREMENT 是否会重建表?

我有以下架构的表格:

CREATE TABLE `tblsomething` (
  `something_id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`something_id`)
) ENGINE=InnoDB AUTO_INCREMENT=144620955 

我需要删除自动增量。所以我想这样做:

ALTER TABLE tblsomething MODIFY something_id int NOT NULL;

但是 MySQL 文档的这部分让我担心:

在大多数情况下,ALTER TABLE 的工作方式是制作原始表的临时副本。对副本执行更改,然后删除原始表并重命名新表。在 ALTER TABLE 执行期间,其他会话可以读取原始表。对表的更新和写入将暂停,直到新表准备就绪,然后自动重定向到新表,而不会出现任何失败的更新。

那么删除自动增量实际上是这些情况之一吗?它会锁定我的表吗?

答案1

删除(或设置)AUTO_INCREMENT 标志不会重建整个表。您可以使用包含大量行的表轻松测试这一点(设置该标志几乎是即时的)。

更新:很久以前这可能确实是真的(使用 MyISAM),但看起来现在不再如此。

答案2

某些ALTER TABLE语句总是会产生如您所描述的可怕的重建。

如果删除AUTO_INCREMENT字段,唯一能防止这种情况发生的方法是使用一些不受支持的黑客手段。这涉及修改表文件的副本.frm。这样做之所以有效,是因为架构信息与数据和索引信息是分开保存的,修改不会在三者之间产生任何不一致。

您可以在以下位置找到有关此问题的讨论mysqlperformanceblog.org并在高性能 MySQL 书籍。但需要强调的是,它不受支持。我建议您首先在数据副本上测试这两种方法(纯文本ALTER TABLE和编辑)。查看这两个过程需要多长时间,然后检查一致性。.frm


编辑:抱歉,我重读了之前写的内容,发现ALTER COLUMN它不适用于你正在做的事情。我已更新了上面的文字。

相关内容