我有以下架构的表:
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 时,其他会话可以读取原始表。对表的更新和写入会停止,直到新表准备好,然后自动重定向到新表,而不会出现任何失败的更新。
那么放弃自动增量实际上是这些情况之一吗?它会锁住我的桌子吗?
正如您所描述的,某些
ALTER TABLE
陈述将始终产生可怕的重建。在删除
AUTO_INCREMENT
字段的情况下,防止这种情况发生的唯一方法是一些不受支持的黑客行为。这涉及修改表.frm
文件的副本。它之所以有效,是因为模式信息与数据和索引信息分开保存,并且修改不会在三者之间产生任何不一致。您可以在mysqlperformanceblog.org和High Performance MySQL book中找到有关它的讨论。重要的是要强调它不受支持。我建议您首先在数据副本上测试两种方法(普通
ALTER TABLE
和编辑)。.frm
查看这两个过程需要多长时间并检查之后的一致性。编辑:对不起,我重新阅读了所写的内容,
ALTER COLUMN
不适用于您正在做的事情。我已经更新了上面的文字。删除(或设置)AUTO_INCREMENT 标志不会重建整个表。您可以使用具有大量行的表轻松测试这一点(设置该标志几乎是瞬时的)。
更新:这在很久以前可能是真的(使用 MyISAM),但现在看起来已经不是这样了。