PR

【SQL】ALTER TABLE を3分でわかりやすく解説

Database

ALTER TABLE はデータベースのテーブルの構造を変更するために使用されるSQLコマンドです。

ALTER TABLE 文でできること
  • テーブル / カラム / インデックスの名称変更
  • カラム / インデックスの追加
  • カラム定義の変更
  • カラム / インデックスの削除
-- テーブル名の変更
ALTER TABLE テーブル名 RENAME TO 新テーブル名;

-- インデックス名の変更
ALTER TABLE テーブル名 RENAME INDEX インデックス名 TO 新インデックス名;

-- カラム名の変更
ALTER TABLE テーブル名 RENAME COLUMN カラム名 TO 新カラム名;

-- カラムの追加
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;

-- インデックスの追加
ALTER TABLE テーブル名 ADD INDEX テーブル名 (カラム名);

-- カラム名&カラム定義の変更
ALTER TABLE テーブル名 CHANGE COLUMN カラム名 新カラム名 データ型 制約;

-- カラム定義の変更
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 データ型 制約;

-- カラムの削除
ALTER TABLE テーブル名 DROP COLUMN カラム名;

-- インデックスの削除
ALTER TABLE テーブル名 DROP INDEX インデックス名;

このページではALTER TABLE(カラムの追加・変更・削除、インデックスや制約の変更)の使い方をSQL初心者向けに1からわかりやすく解説します。

このページで学べる内容
  • ALTER TABLE の使い方
    • ALTER TABLE の各種オプションと処理内容
  • ALTER TABLE の注意点

システムエンジニア / プログラマーを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

スポンサーリンク

ALTER TABLE

ALTER TABLE はテーブル定義の変更を行う際に用いるSQLコマンドです。

ALTER TABLE 文でできること
  • テーブル / カラム / インデックスの名称変更
  • カラム / インデックスの追加
  • カラム定義の変更
  • カラム / インデックスの削除

ここでは「テーブルの定義を変更する場合は "ALTER TABLE" ね!」と理解しておけばOKです。

ここからはサンプルコード付きでALTER TABLEの使い方・処理内容を具体的にご説明していきます。

ALTER TABLE RENAME:テーブル/カラム/インデックスの名称変更

-- テーブル名の変更
ALTER TABLE テーブル名 RENAME TO 新テーブル名;

-- インデックス名の変更
ALTER TABLE テーブル名 RENAME INDEX インデックス名 TO 新インデックス名;

-- カラム名の変更
ALTER TABLE テーブル名 RENAME COLUMN カラム名 TO 新カラム名;

ALTER TABLE でRENAMEオプションを利用することで、テーブル名・カラム名・インデックス名を変更することができます。

テーブル「tbl_a」の名称を変更する例がこちらです。

/*
show tables;
+--------------------+
| Tables_in_sampledb |
+--------------------+
| tbl_a              |
+--------------------+
*/

ALTER TABLE tbl_a RENAME TO new_tbl_a;

/* 結果
show tables;
+--------------------+
| Tables_in_sampledb |
+--------------------+
| new_tbl_a          | ←テーブル名が変更されている
+--------------------+

処理内容は簡単です。もちろん、当該テーブルを参照するビューやプログラムがある場合はそちらも影響を受けるため注意が必要です。

ALTER TABLE を実施する前には必ず「どこに影響があるか?」を必ず事前に明確にしておくことが重要です。

カラム名・インデックス名を変更する場合は以下の通り。それぞれ、RENAMEオプションの後に "INDEX" / "COLUMN" を指定します。

-- インデックス名の変更
ALTER TABLE テーブル名 RENAME INDEX インデックス名 TO 新インデックス名;

-- カラム名の変更
ALTER TABLE テーブル名 RENAME COLUMN カラム名 TO 新カラム名;

ALTER TABLE ADD:カラム/インデックスの追加

ALTER TABLE でADDオプションを利用することで指定したテーブルにカラム/インデックスを追加することが可能です。

-- カラムの追加
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;

-- インデックスの追加
ALTER TABLE テーブル名 ADD INDEX テーブル名 (カラム名);

テーブル「new_tbl_a」に新たなカラム追加を行うサンプルコードがこちらです。

/* 変更前
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| ID    | int(3)      | YES  |     | NULL    |       |
| Name  | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
*/

ALTER TABLE new_tbl_a ADD New_Column varchar(100);

/* 変更後
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ID         | int(3)       | YES  |     | NULL    |       |
| Name       | varchar(50)  | YES  |     | NULL    |       |
| New_Column | varchar(100) | YES  |     | NULL    |       |←列が追加された
+------------+--------------+------+-----+---------+-------+
*/

カラム "New_Column" が追加されました。

同様にインデックスを追加するサンプルコードも記載しておきます。

-- ID列にインデックスを作成
ALTER TABLE new_tbl_a ADD INDEX idx_1 (ID);

/* インデックス定義を表示(わかりやすいように一部省略して表示)
+------------+------------+----------+-------------+------+------------+
| Table      | Non_unique | Key_name | Column_name | Null | Index_type |
+------------+------------+----------+-------------+------+------------+
| sample_tbl |          1 | idx_1    | ID          | YES  | BTREE      |
+------------+------------+----------+-------------+------+------------+
*/

インデックスの作成は CREATE INDEX を利用することも可能。詳しくは以下の記事をご覧ください。

ALTER TABLE CAHNGE:カラム名&カラム定義の変更

続いて、カラム定義の変更について解説します。変更方法は以下の2パターン存在しますので、この機会にしっかり整理して理解しておきましょう。

CHANGE vs MODIFY
  • CHANGEオプション
    カラム名&カラム定義の変更を行う
  • MODIFYオプション
    カラム定義の変更を行う

CHANGEオプションの構文ルールは以下の通り。

-- カラム名&カラム定義の変更
ALTER TABLE テーブル名 CHANGE COLUMN カラム名 新カラム名 データ型 制約;

実際のサンプルコードがこちらです。

/* 変更前
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| ID         | int(3)       | YES  |     | NULL    |       |
| Name       | varchar(50)  | YES  |     | NULL    |       |
| New_Column | varchar(100) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
*/

-- カラム名&カラム定義の変更
ALTER TABLE new_tbl_a CHANGE COLUMN New_Column New_Column_ver2 int(100) unique;

/* 変更後
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| ID              | int(3)      | YES  |     | NULL    |       |
| Name            | varchar(50) | YES  |     | NULL    |       |
| New_Column_ver2 | int(100)    | YES  | UNI | NULL    |       |←カラム名&定義の変更
+-----------------+-------------+------+-----+---------+-------+
*/

ALTER TABLE MODIFY:カラム定義の変更

カラム定義のみ変更したい場合は、MODIFYオプションを用います。

CHANGE vs MODIFY
  • CHANGEオプション
    カラム名&カラム定義の変更を行う
  • MODIFYオプション
    カラム定義の変更を行う

MODIFYオプションの構文ルールは以下の通り。

-- カラム定義の変更
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 データ型 制約;

データ型と制約を変更するサンプルコードがこちら。

/* 変更前
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| ID              | int(3)      | YES  |     | NULL    |       |
| Name            | varchar(50) | YES  |     | NULL    |       |
| New_Column_ver2 | int(100)    | YES  | UNI | NULL    |       |
+-----------------+-------------+------+-----+---------+-------+
*/ 

--カラム定義の変更
ALTER TABLE new_tbl_a MODIFY COLUMN Id varchar(100) NOT NULL PRIMARY KEY;

/* 変更後
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| Id              | varchar(100) | NO   | PRI | NULL    |       |←データ型&制約が変更された
| Name            | varchar(50)  | YES  |     | NULL    |       |
| New_Column_ver2 | int(100)     | YES  | UNI | NULL    |       |
+-----------------+--------------+------+-----+---------+-------+
*/

ALTER TABLE DROP:カラム/インデックスの削除

カラムを削除する場合はALTER TABLEのDROPオプションを利用します。

構文ルールとサンプルコードは以下の通り。

-- カラムの削除
ALTER TABLE テーブル名 DROP COLUMN カラム名;

-- インデックスの削除
ALTER TABLE テーブル名 DROP INDEX インデックス名;

サンプルコード

/* 変更前
+-----------------+--------------+------+-----+---------+-------+
| Field           | Type         | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| Id              | varchar(100) | NO   | PRI | NULL    |       |
| Name            | varchar(50)  | YES  |     | NULL    |       |
| New_Column_ver2 | int(100)     | YES  | UNI | NULL    |       |
+-----------------+--------------+------+-----+---------+-------+

-- カラムの削除
ALTER TABLE new_tbl_a DROP COLUMN New_Column_ver2;

/* 変更後
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| Id    | varchar(100) | NO   | PRI | NULL    |       |
| Name  | varchar(50)  | YES  |     | NULL    |       |
|       |              |      |     |         |       |←カラムが削除された
+-------+--------------+------+-----+---------+-------+
*/

カラムを削除してしまうと、対象のカラムに格納されていたレコードも同時に削除されてしまうので注意しましょう。

インデックスを削除するサンプルコードもあわせて記載しておきます。

/* インデックス定義を表示(変更前)
+------------+------------+----------+-------------+------+------------+
| Table      | Non_unique | Key_name | Column_name | Null | Index_type |
+------------+------------+----------+-------------+------+------------+
| sample_tbl |          1 | idx_1    | ID          | YES  | BTREE      |
| sample_tbl |          1 | idx_2    | AAA         | YES  | BTREE      |
| sample_tbl |          1 | idx_2    | BBB         | YES  | BTREE      |
| sample_tbl |          1 | idx_2    | EEE         | YES  | BTREE      |
+------------+------------+----------+-------------+------+------------+
*/


--  インデックス(idx_1)の削除
ALTER TABLE sample_tbl DROP INDEX idx_1;


/* インデックス定義を表示(ide_1)が削除されている
+------------+------------+----------+-------------+------+------------+
| Table      | Non_unique | Key_name | Column_name | Null | Index_type |
+------------+------------+----------+-------------+------+------------+
| sample_tbl |          1 | idx_2    | AAA         | YES  | BTREE      |
| sample_tbl |          1 | idx_2    | BBB         | YES  | BTREE      |
| sample_tbl |          1 | idx_2    | EEE         | YES  | BTREE      |
+------------+------------+----------+-------------+------+------------+
*/
【まとめ】ALTER TABLE 文でできること
  • テーブル / カラム / インデックスの名称変更
  • カラム / インデックスの追加
  • カラム定義の変更
  • カラム / インデックスの削除
-- テーブル名の変更
ALTER TABLE テーブル名 RENAME TO 新テーブル名;

-- インデックス名の変更
ALTER TABLE テーブル名 RENAME INDEX インデックス名 TO 新インデックス名;

-- カラム名の変更
ALTER TABLE テーブル名 RENAME COLUMN カラム名 TO 新カラム名;

-- カラムの追加
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;

-- インデックスの追加
ALTER TABLE テーブル名 ADD INDEX テーブル名 (カラム名);

-- カラム名&カラム定義の変更
ALTER TABLE テーブル名 CHANGE COLUMN カラム名 新カラム名 データ型 制約;

-- カラム定義の変更
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 データ型 制約;

-- カラムの削除
ALTER TABLE テーブル名 DROP COLUMN カラム名;

-- インデックスの削除
ALTER TABLE テーブル名 DROP INDEX インデックス名;

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました