今回は、RDBMS上に作成したテーブルの定義を変更するSQL文について説明します。
テーブルの定義の変更とは、下記のような操作のことを指します。
- テーブル名の変更
- 列名の変更
- 列のデータ型の変更
- 列のNOT NULL制約の変更
- 列の順番の変更(PostgreSQLは不可)
これらは、SQLのALTER TABLE文を実行することで操作することができます。
この記事ではALTER TABLE文を使って、RDBMSのテーブルの定義を変更する様々な用途について、説明します。なお、ALTER TABLEは、MySQLとPostgreSQLで、多少、記述が異なる箇所があります。
ALTER TABLEについて
この記事では、ALTER TABLEを使ったRDBMSの様々な操作方法を説明しますが、ALTER TABLEは『テーブルの定義を変更』するためのSQLです。
用途ごとに、それぞれのALTER TABLE文の基本文法は異なっていますが、基本は『テーブルの定義を変更』するためのSQLであることは理解しておきましょう。
テーブル名の変更
テーブル名を変更する場合は、[ALTER TABLE ~ RENAME TO]を使います。
基本文法_テーブル名の変更
ALTER TABLE 現在のテーブル名 RENAME TO 変更後のテーブル名;
実例_テーブル名の変更
- 現在のテーブル名・・・・Worker
- 変更後のテーブル名・・Employee
たとえば、RDBMS上に作成されているテーブル「Worker」の名前を「Employee」に変更するときには下記のようにSQL文を記述します。
SQL[ALTER TABLE ~ RENAME TO文]
ALTER TABLE Worker RENAME TO Employee;
MySQL_テーブル名の変更
PostgreSQL_テーブル名の変更
列名の変更
列名を変更する場合は、[ALTER TABLE ~ RENAME COLUMN TO]を使います。
基本文法_列名の変更
ALTER TABLE テーブル名 RENAME COLUMN 変更前の列名 TO 変更後の列名;
実例_列名の変更
- 現在の列名・・・・wage
- 変更後の列名・・wage_rank
たとえば、Workerテーブル内の列「wage」の名前を「wage_rank」に変更するときには下記のようにSQL文を記述します。
SQL[ALTER TABLE ~ RENAME COLUMN TO文]
ALTER TABLE Worker RENAME COLUMN wage TO wage_rank;
MySQL_列名の変更
PostgreSQL_列名の変更
列のデータ型の変更
列のデータ型を変更する場合は、[ALTER TABLE ~ MODIFY COLUMN]を使います。なお、列のデータ型の変更については、MySQLとPostgreSQLで記述が異なります。
PostgreSQLの場合、文字型から数値型に変更する場合などは、CAST(キャスト)の処理が必要になります。ここでは、文字型から数値型に変更する場合のSQLを紹介します。
基本文法_列のデータ型の変更
ALTER TABLE テーブル名 MODIFY COLUMN 列名 変更後のデータ型;–MySQL
ALTER TABLE テーブル名 ALTER COLUMN 列名 TYPE 変更後のデータ型
USING CAST(worker_id AS 変更後のデータ型);–PostgreSQL
上記のPostgreSQLの基本文法は、文字型から数値型(または逆)に変更する場合のSQL文です。
実例_列のデータ型の変更
- 現在のデータ型・・・・char(5)
- 変更後のデータ型・・integer
たとえば、Workerテーブル内の列「worker_id」のデータ型を「integer」に変更するときには下記のようにSQL文を記述します。
SQL[ALTER TABLE ~ MODIFY COLUMN文]
ALTER TABLE Worker MODIFY COLUMN worker_id INTEGER;--MySQL
ALTER TABLE Worker ALTER COLUMN worker_id TYPE INTEGER USING CAST(worker_id AS INTEGER);--PostgreSQL
MySQL_列のデータ型の変更
PostgreSQL_列のデータ型の変更
列のNOT NULL制約の変更
列のNOT NULL制約を変更する場合は、[ALTER TABLE ~ MODIFY COLUMN ~ NULL]、または[ALTER TABLE ~ MODIFY COLUMN ~ NOT NULL]を使います。
なお、NOT NULL制約の変更については、MySQLとPostgreSQLで記述が異なります。
基本文法_列のNOT NULL制約の変更
–NOT NULLに変更する
ALTER TABLE テーブル名 MODIFY COLUMN 列名 データ型 NOT NULL;—MySQL
ALTER TABLE テーブル名 ALTER COLUMN 列名 SET NOT NULL;—PostgreSQL
–NULL許容に変更する
ALTER TABLE テーブル名 MODIFY COLUMN 列名 データ型 NULL;—MySQL
ALTER TABLE テーブル名 ALTER COLUMN 列名 DROP NOT NULL;—PostgreSQL
実例_列のNOT NULL制約の変更
たとえば、Workerテーブル内の列「position」のNOT NULL制約を変更するときには下記のようにSQL文を記述します。
SQL[NOT NULLに変更する]
ALTER TABLE Worker MODIFY COLUMN position INTEGER NOT NULL;--MySQL
ALTER TABLE Worker ALTER COLUMN position SET NOT NULL;--PostgreSQL
MySQL
PostgreSQL
SQL[NULL許容に変更する]
ALTER TABLE Worker MODIFY COLUMN position INTEGER NULL;--MySQL
ALTER TABLE Worker ALTER COLUMN position DROP NOT NULL;--PostgreSQL
MySQL
PostgreSQL
テーブル内の列の順番の変更(MySQLのみ)
テーブル内の列の順番を変更する場合は、[ALTER TABLE ~ MODIFY ~ AFTER]を使います。
ただし、PostgreSQLでは列の順番を変更することはできません。
基本文法_列の順番の変更
–MySQL(任意の列のあとに移動する)
ALTER TABLE テーブル名 MODIFY 順番を変えたい列名 データ型 AFTER 移動先の列名;
–MySQL(一番最初の列に移動する)
ALTER TABLE テーブル名 MODIFY 順番を変えたい列名 データ型 FIRST;
実例_列の順番の変更
たとえば、Workerテーブル内の列「position」の順番を、列「gender」の次に変更するときには下記のようにSQL文を記述します。
SQL[列の順番を変更する]
ALTER TABLE Worker MODIFY position INTEGER AFTER gender;--MySQL
MySQL_列の順番の変更
あとがき
今回は、RDBMS上のテーブルの定義を変更するためのSQL文[ALTER TABLE]について記事にしました。
ご覧いただいた通り、ALTER TABLEの用途は様々で、当然、それぞれでSQLの記述も異なります。また、MySQLとPostgreSQLで記述が異なる箇所もあります。
多くの用途を説明しましたので、当記事の文字数も多くなりましたが、だいぶSQLにも慣れてきたのではないでしょうか。なお、ALTERテーブルで列を追加・削除する方法については、別記事で紹介していますので、ご関心があればご覧ください。