我有以下架构表:
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通过创build原始表的临时副本来工作。 对副本进行更改,然后删除原始表,并重命名新的表。 在执行ALTER TABLE时,原始表可以被其他会话读取。 对表进行更新和写入操作将停止,直到新表准备就绪,然后自动redirect到新表而不会有任何失败的更新。
那么实际上下降自动增量是这些情况之一吗? 会锁住我的桌子吗?
删除(或设置)AUTO_INCREMENT标志不会重build整个表。 您可以使用大量行的表格(设置该标志几乎是瞬间的)来轻松地进行testing。
某些ALTER TABLE语句总是会按照您的描述产生一个可怕的重build。
在删除AUTO_INCREMENT字段的情况下,防止这种情况的唯一方法是一些不受支持的hackery。 这涉及修改表的.frm文件的副本。 它的工作原理是因为模式信息与数据和索引信息分开存放,并且修改不会在三者之间产生任何不一致。
您可以在mysqlperformanceblog.org和High Performance MySQL书籍中find关于它的讨论。 尽pipe如此,强调它是不受支持的。 我build议你先testing两个方法(普通的ALTER TABLE和.frm编辑)在数据的副本上。 看看这两个过程需要多长时间,然后检查一致性。
编辑:对不起,我重新读了什么是写和ALTER COLUMN不适用于你在做什么。 我已经更新了上面的文字。