SQL│テーブルの定義を変更する。列のデータ型や名前、順番の変更

今回は、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_テーブル名の変更

現在のテーブル一覧。テーブル[worker]の名前を[Employee]に変更する
ALTER TABLE worker RENAME TO Employee;
実行後、テーブル名が変更された

PostgreSQL_テーブル名の変更

現在のテーブル一覧。テーブル[worker]の名前を[Employee]に変更する
ALTER TABLE worker RENAME TO Employee;
実行後、テーブル名が変更された

列名の変更

列名を変更する場合は、[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_列名の変更

現在のテーブル。列[wage]の名前を[wage_rank]に変更する
ALTER TABLE worker RENAME COLUMN wage TO wage_rank;
実行後、列名が変更された

PostgreSQL_列名の変更

現在のテーブル。列[wage]の名前を[wage_rank]に変更する
ALTER TABLE worker RENAME COLUMN wage TO wage_rank;
実行後、列名が変更された

列のデータ型の変更

列のデータ型を変更する場合は、[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_列のデータ型の変更

現在のworker_idのデータ型はchar(5)
ALTER TABLE worker MODIFY COLUMN INTEGER;
実行後、データ型が変更された

PostgreSQL_列のデータ型の変更

現在のworker_idのデータ型はchar(5)
ALTER TABLE worker ALTER COLUMN worker_id TYPE INTEGER USING CAST(worker_id AS INTEGER);
実行後、データ型が変更された(文字型から数値型への変更)

列の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
実例画像の紹介〜NOT NULL

MySQL

MySQL変更前
position = NULL許容
MySQL変更後
position = NOT NULL

PostgreSQL

PostgreSQL変更前
position = NULL許容
PostgreSQL変更後
position = NOT NULL

SQL[NULL許容に変更する]

ALTER TABLE Worker MODIFY COLUMN position INTEGER NULL;--MySQL
ALTER TABLE Worker ALTER COLUMN position DROP NOT NULL;--PostgreSQL
実例画像の紹介〜NULL許容

MySQL

MySQL変更前
position = NOT NULL
MySQL変更後
position = NULL許容

PostgreSQL

PostgreSQL変更前
position = NOT NULL
PostgreSQL変更後
position = NULL許容

テーブル内の列の順番の変更(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_列の順番の変更

現在の列[position]の順番は最後尾
ALTER TABLE worker MODIFY position INTEGER AFTER gender;
実行後、列[position]の順番が変更された

あとがき

今回は、RDBMS上のテーブルの定義を変更するためのSQL文[ALTER TABLE]について記事にしました。

ご覧いただいた通り、ALTER TABLEの用途は様々で、当然、それぞれでSQLの記述も異なります。また、MySQLとPostgreSQLで記述が異なる箇所もあります。

多くの用途を説明しましたので、当記事の文字数も多くなりましたが、だいぶSQLにも慣れてきたのではないでしょうか。なお、ALTERテーブルで列を追加・削除する方法については、別記事で紹介していますので、ご関心があればご覧ください。

目次