4

AUTO_INCREMENT PRIMARY KEY ID 列を INT から BIGINT に更新中です。InnoDB テーブルで MySQL バージョン 5.0.82 を使用しています。それらは次のようになります。

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 がまだ存在していることに気付きました。制約が再作成された後も、キー FK1 はまだ適用可能であると思います。しかし、私の質問は、MySQL はこのキーを更新して BIGINT に適用できるようにするのか、それとも INT 機能のみを維持するのかということです。

ALTER TABLE の MySQL リファレンス ガイドを調べたところ、列のサイズがインデックスの長さよりも短くなるとインデックスが短くなるという記述が見つかりましたが、テーブルに何が起こるかを示すものは何も見つかりませんでした基になる列のサイズが大きくなった場合のインデックス。(インデックスも削除して再作成する必要があるかどうか、またはMySQLが期待どおりに機能するかどうかを知りたいです。)

4

1 に答える 1

6

基本的に、列のデータ型を変更すると、インデックスが再構築されます。

実際には、そのテーブルのすべてのインデックスを再構築します。

MySQLの一部のタイプのALTER TABLEステートメントでは、テーブルが再構築されます。

  1. テーブルをロックします。
  2. 列の新しい定義で新しい空のテーブルを作成します。
  3. すべてのデータを行ごとに古いテーブルから新しいテーブルにコピーします。これにより、新しいデータを INSERT する場合と同様に、新しいテーブルのインデックスが自然に埋められます。
  4. テーブルの名前を交換します。
  5. 元のテーブルを削除します。
  6. テーブルのロックを解除します。

これは特に、InnoDB テーブルの主キー列を変更する場合に当てはまります。これは、すべての InnoDB テーブルがその主キーのクラスター化インデックスとして格納されるためです。

したがって、列のデータ型を変更すると、それが新しいテーブルに適用され、元のテーブルから新しいテーブルに行をコピーするときにインデックスがいっぱいになります。

于 2012-10-30T19:31:40.640 に答える