MySQL

ALTER TABLEのめも

まえがき

開発をしていると、仕様の変更に伴ってすでに用意したDBテーブルへ変更がはいる場合があります。
そんなとき、大幅な変更であればDBテーブルごと新しく作ったりしますが、
ちょっとした変更であればALTER TABLEで対応するわけです。

なので、わりとなじみが深いALTER TABLEなんですが、
変更対象がカラムならサクサクっと出来るのだけど、
相手がテーブルやインデックスとなるとちょっと怪しくなって、Google先生に頼ってしまいます。。

とはいえ、大概先生に聴くのもメンドくさくなったので、自分用に残しておきます

相手がテーブル

この記事を書くきっかけになった対応。
あんまりテーブル自体に対してALTER TABLEはしないので、いざやろうとしても手が動かないレベルです。。

テーブルの名前変更

ALTER TABLE [old_table_name] RENAME [new_table_name];

テーブル名にはスキーマ名を明記するクセがついているといいかも。

ツール(A5:Mk-2とか)で別スキーマのテーブル名を変更しようとしたとき、
うっかり新しいテーブル名にスキーマ名を付け忘れて、全然別のスキーマ上に新テーブルをつくってしまい、
ソースが動かなくて小1時間悩んでみたりすることがたまにある。。

テーブルのコメント変更

ALTER TABLE [old_table_name] COMMENT [new_table_name];

別に直接システムに何か影響があるわけじゃないのだけど、
役割が変わってしまったり誤字があったりとちょっと直したいときに。

テーブルの文字コード変更

ALTER TABLE [old_table_name] DEFAULT CHARACTER SET [charset_name];

絵文字対応でUTF8からUTF8mb4に変更する、とか。
まぁ、最初からUTF8mb4で作っておけよって言われかねないですが、、、

AUTO_INCREMENTの変更

ALTER TABLE [table_name] AUTO_INCREMENT = [value];

開発ではつかわないクセに、本番で実行することが比較的多い、困ったコマンド。。。
まぁ、あらかじめ始めの値が分かっている場合はDDLのCREATE TABLEに仕込んでおいたりするので、
そこまでよく使うってわけでもないですが、、、

相手がインデックス

追加と削除は問題ないんですが、インデックスの貼り換えでよくとちります。
安直にCHANGE INDEXとかMODIFY INDEXとか打って怒られるとか。。。

インデックスの追加

ALTER TABLE [table_name] ADD INDEX [index_name] ([column_name]);

インデックスの変更

ALTER TABLE [table_name] DROP INDEX [index_name];

インデックスの変更

ALTER TABLE [table_name] DROP INDEX [index_name], ADD INDEX [index_name] ([column_name]);

カラムと違って、変更のためのコマンドは用意されていない(らしい)。
なので、削除→追加で対応します。

相手がカラム

さすがに相手がカラムとなると困ることは滅多にないんだけど、ついでなので残しておきましょう。

カラムの追加

-- 一番最後に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition];

-- 一番最初に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition] FIRST;

-- 指定したカラムの後に追加
ALTER TABLE [table_name] ADD COLUMN [column_name] [column_definition] AFTER [column_name];

FIRST・・・・使った覚えがないな。。。

カラムの変更

-- カラム定義のみ変更
ALTER TABLE [table_name] MODIFY COLUMN [column_name] [column_definition];

-- カラム名もあわせて変更
ALTER TABLE [table_name] CHANGE COLUMN [old_column_name] [new_column_name] [column_definition];

カラムの削除

ALTER TABLE [table_name] DROP COLUMN [column_name];

あとがき

我ながら「マニュアル読めよ!」レベルですな。。(゚Д゚;)
まぁ、ググる手間を省くためなので、、、