B.5.7.1 ALTER TABLE での問題

ALTER TABLE を使用して文字セットまたは文字カラムの照合順序を変更するときに、重複キーエラーを受け取った場合、原因は新しいカラムの照合順序が同じ値に対して 2 つのキーをマップしたか、テーブルが破損していることです。後者の場合は、そのテーブルに対して REPAIR TABLE を実行してください。

ALTER TABLE が次のエラーで停止した場合、問題は ALTER TABLE の初期の処理中に MySQL がクラッシュしたことである可能性があり、A-xxx または B-xxx という名前の古いテーブルが残っていることがあります。

Error on rename of './database/name.frm'
to './database/B-xxx.frm' (Errcode: 17)

この場合は、MySQL のデータディレクトリに移動して、A- または B- で始まる名前を持つすべてのファイルを削除します。(それらのファイルを削除せずに、別の場所に移動することもできます。)

ALTER TABLE は次のように動作します。

  • 要求された構造の変更を適用した A-xxx という名前の新しいテーブルを作成します。

  • 元のテーブルから A-xxx にすべての行をコピーします。

  • 元のテーブルの名前を B-xxx に変更します。

  • A-xxx を元のテーブル名に変更します。

  • B-xxx を削除します。

名前変更の操作に問題があった場合、MySQL は変更を取り消そうとします。重大な問題がある場合 (発生することはないはずですが)、MySQL は古いテーブルを B-xxx として残すことがあります。システムレベルでテーブルファイルを単純に名前変更することによって、データは元に戻ります。

トランザクションテーブルに対して ALTER TABLE を使用したとき、または Windows を使用しているときに、LOCK TABLE が発行されていた場合、ALTER TABLE はテーブルをロック解除します。これが行われるのは、InnoDB およびこれらのオペレーティングシステムは使用されているテーブルをドロップできないためです。

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by Chad Attermann on April 21, 2006
Note that when using ALTER TABLE to change the table name while holding a lock on that table (via LOCK TABLES), any SELECT/INSERT/UPDATE on that table which is waiting in another thread for the lock to be released will fail immediately after ALTER TABLE with "ERROR 1146: Table 'tbl_name' doesn't exist". This situation is probably rare, but I found this out while testing an implementation of MERGE tables, where I wanted to rename table X to X_OLD, and then create a new table X of type MERGE that includes table X_OLD. I assumed that LOCK TABLES X would cause other threads to wait for this switch to complete before attempting to access table X, but I was wrong. There may be another more appropriate locking mechanism for this scenario, but I have yet to find it.
  Posted by Chad Attermann on April 21, 2006
Regarding the problem described above with renaming a table and creating a MERGE table in its place, there is a simple solution. The following statements will safely create a MERGE table X to replace existing table X on a live database.


While I was unable to completely test this since the RENAME TABLE operation is so fast, it is documented that the table "swap" is performed as a single atomic operation and therefore should be safe to use on a live database without adversely effecting any activity on table X.
  Posted by Michał Smoliński on June 22, 2006
Error on rename the table occurs also when you try to drop a primary key from the InnoDB table that is referenced by other tables (i.e. there exists a foreign key constraint that references the primary key you want to drop.) It's a pity that mysql doesn't report this error in more user friendly way.
  Posted by Richard Stanton on December 6, 2007
I really hope I have misunderstood this, cos it doesn't sound good!!

Are you saying that if you alter a table (which drops/recreates it) when another table has a constraint referencing the primary key in the table you're altering, it fails??

If so, then it doesn't bode well for amending table structures in the future :-/

That would explain why MySQL ALTER TABLE fails on some constraints that I try to create after creating all required MySQL tables (there's over 30 constraints in my current project).


Sign Up Login You must be logged in to post a comment.