2011-11-17 17 views

答えて

6

残念ながら、MySQLには完全なテーブルコピーを実行する必要があります(ALTER TABLE ... CHANGE COLUMN)。

チェックアウトpt-online-schema-change。これは、ALTERの期間中にテーブル全体をロックせずに、テーブルに対して多くのタイプのALTER変更を行うのに役立ちます。新しいテーブルにデータをコピーしている間は、元のテーブルを読み書きすることができます。変更はキャプチャされ、トリガを介して新しいテーブルに適用されます。

例:

pt-online-schema-change h=localhost,D=databasename,t=tablename \ 
    --alter 'CHANGE COLUMN oldname newname NUMERIC(9,2) NOT NULL' 

更新:のMySQL 5.6がテーブルを再構築し、列の名前を変更することなく、ALTER操作のいくつかの種類を行うことができますが、オンラインでの変化としてサポートされているものの一つであります。どのタイプの変更がこれをサポートするかどうかの概要については、http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.htmlを参照してください。

0

制約がない場合は、私が知る限り、それを変更することができます。最初に制約を削除する必要がある場合は、制約を変更して追加し直してください。

0

多くの行を含む表を変更すると、時間がかかることがあります(ただし、関連する列が索引付けされていない場合はそれほど簡単ではありません)。

あなたが特にその目的のために特別に作成さALTER TABLE構文を使用しないようにしたい場合、あなたは常に、ほぼ正確に同じ構造(ただし、別の名前)を持つテーブルを作成することができますし、のようなので、そこにすべてのデータをコピーします。

CREATE TABLE `your_table2` ...; 
    -- (using the query from SHOW CREATE TABLE `your_table`, 
    -- but modified with your new column changes) 

LOCK TABLES `your_table` WRITE; 
INSERT INTO `your_table2` SELECT * FROM `your_table`; 
RENAME TABLE `your_table` TO `your_table_old`, `your_table2` TO `your_table`; 

一部のALTER TABLEクエリでは、上記はかなり速くなる可能性があります。しかし、簡単な列名の変更のために、それは簡単かもしれません。私は同じテーブルを作成し、それを実際に見ている時間を確認するために変更を実行する可能性があります。

関連する問題