我正在更新我的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