まず、ALTERが嫌いだと言ってみましょう。それは悪です、私見。
たとえば、これは現在のテーブルスキーマです-
CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;
私がお勧めするパスは次のとおりです-
古いテーブルオブジェクトを置き換える新しいテーブルオブジェクトを作成します。
CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8
古いテーブルのすべての行を名前で新しいテーブルに挿入します。
INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;
移行の煙テスト:
SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;
ロールバックする必要がある場合に備えてバックアップを維持できるように、テーブル名を交換します。
RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;
回帰テストに進みます。
このアプローチは、複数のインデックスと数百万行のテーブルでますます望ましいものになります。
考え?