我正在更新我的AUTO_INCREMENT PRIMARY KEY ID列从INT到BIGINT的过程。我在InnoDB表中使用MySQL版本5.0.82。他们看起来是这样的:如果我改变它的列,MySQL会对索引产生什么影响?
FactTable
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| Path | varchar(64) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
AttemptTable
+---------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| TriedOn | datetime | NO | | NULL | |
| FactID | int(11) | NO | MUL | NULL | |
+---------+----------+------+-----+---------+----------------+
凡AttemptTable有KEY FK1 (FactID)
和CONSTRAINT FK1 FOREIGN KEY (FactID) REFERENCES FactTable (ID)
。所以我更新的过程中一直是:
ALTER TABLE AttemptTable DROP FOREIGN KEY FK1,
MODIFY ID BIGINT(20) NOT NULL AUTO_INCREMENT,
MODIFY FactID BIGINT(20) NOT NULL;
ALTER TABLE FactTable MODIFY ID BIGINT(20) NOT NULL AUTO_INCREMENT;
ALTER TABLE AttemptTable ADD CONSTRAINT FK1 FOREIGN KEY (FactID)
REFERENCES FactTable (ID);
现在,我已经注意到,在做这些修改时,该约束被丢弃后的关键FK1仍然存在,而且我认为它仍然适用后的约束重建。但我的问题是,MySQL更新此密钥是否适用于BIGINTs,还是仅维护INT功能?
我查看了ALTER TABLE的MySQL参考指南,并且发现如果列的大小减小到小于索引的长度,那么索引将会缩短,但我找不到任何指示什么如果底层列的大小增大,则会发生索引。 (我想知道我是否应该删除并重新创建索引,或者如果MySQL会做我期望的)
我不确定。但是,如果表格不是太大,是否可以选择简单地删除indeces,执行更改,然后重新应用indeces?对于一张大桌子来说,这可能会很慢。 (虽然我认为改变一个大表中有一个独立的列将会像重建或调整索引一样慢。) – Marvo