![在 MySQL 中删除 AUTO_INCREMENT 是否会重建表?](https://linux22.com/image/494056/%E5%9C%A8%20MySQL%20%E4%B8%AD%E5%88%A0%E9%99%A4%20AUTO_INCREMENT%20%E6%98%AF%E5%90%A6%E4%BC%9A%E9%87%8D%E5%BB%BA%E8%A1%A8%EF%BC%9F.png)
我有以下架构的表格:
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
它不适用于你正在做的事情。我已更新了上面的文字。