テーブルを変更する(ALTER TABLE)

作成済みのテーブルを変更するには ALTER TABLE コマンドを使用します。ここでは PostgreSQL で作成済みのテーブルを変更する方法について解説します。

(Last modified: )

テーブルを変更する

ALTER TABLE コマンドを使うことでテーブルを変更することができます。テーブル名やカラム名の変更、カラムの追加削除、制約の追加や削除など変更できる項目は数多くあります。よく利用されるのではと思われる変更方法について順番に試していきます。

テーブル名を変更する

テーブル名を変更するには次の書式を使用します。

ALTER TABLE name RENAME TO new_name

現在のテーブル名( name )を新しいテーブル名( new_name )に変更します。

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \dt コマンドを使ってテーブルの一覧を表示してみます。

\dt

ALTER TABLE/テーブル名を変更する(1)

friends テーブルが作成されていることが確認できました。それではテーブル名を classmate に変更してみます。次のように実行してください。

alter table friends rename to classmate;

テーブル名を変更後にあらためて \dt コマンドを使ってテーブル一覧を表示してみるとテーブル名が classmate に変更されていることが確認できました。

ALTER TABLE/テーブル名を変更する(2)

カラム名を変更する

カラム名を変更するには次の書式を使用します。

ALTER TABLE name
    RENAME [ COLUMN ] column_name TO new_column_name

現在のテーブル名( name )に含まれるカラム名( column_name )を新しいカラム名( new_column_name )に変更します。

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみます。

\d friends

ALTER TABLE/カラム名を変更する(1)

friends テーブルには id カラムと name カラムが定義されています。それでは id カラム名を friendid に変更してみます。次のように実行してください。

alter table friends rename column id to friendid;

カラム名を変更後にあらためて \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみると。カラム名が friendid に変更されていることが確認できました。

ALTER TABLE/カラム名を変更する(2)

スキーマを変更する

テーブルを別のスキーマに移動するには次の書式を使用します。

ALTER TABLE name SET SCHEMA new_schema

テーブル( name )を別のスキーマ( new_schema )に移動します。スキーマはあらかじめ作成しておく必要があります。

実際に試してみます。現在 friends という名前のテーブル名が public スキーマで作成されています。 psql メタコマンドの \dt コマンドを使ってテーブルのスキーマを表示してみます。

\dt friends

ALTER TABLE/スキーマを変更する(1)

friends テーブルは public スキーマに作成されています。それでは friends テーブルを myschema スキーマへ移動してみます。次のように実行してください。

alter table friends set schema myschema;

スキーマを変更したあと、あらためて \dt コマンドを使ってテーブルのスキーマを確認してみると、スキーマが myschema に変更されていることが確認できました。

ALTER TABLE/スキーマを変更する(2)

カラムを追加する

テーブルに新しいカラムを追加するには次の書式を使用します。

ALTER TABLE name
   ADD [ COLUMN ]column_name data_type
     [ COLLATE collation ] [ column_constraint [ ... ] ]

テーブル( name )に新しいカラムをカラム名( column_name )とデータ型( data_type )で追加します。

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみます。

\d friends

ALTER TABLE/カラムを追加する(1)

friends テーブルには id カラムと name カラムが定義されています。

friends テーブルには現在次のようなデータが格納されています。

select * from friends;

ALTER TABLE/カラムを追加する(2)

それではテーブルに新しいカラムを追加します。次のように実行してください。

alter table friends add column address varchar(10);

カラムを追加した後あらためて \d コマンドを使ってテーブルのカラム情報を表示してみると、 address カラムが追加されていることが確認できました。

ALTER TABLE/カラムを追加する(3)

既存のデータの新しく追加されたカラムに格納されているデータを確認するため、あらためて SELECT コマンドを実行してみます。

ALTER TABLE/カラムを追加する(4)

既存のデータの新しいカラムの値はすべて、デフォルト値が明示的に指定されていない場合のデフォルト値である NULL が格納されていました。

-- --

今度は DEFAULT 制約を指定して新しいカラムを追加します。次のように実行してください。

alter table friends add column old integer default 20;

カラムを追加した後あらためて \d コマンドを使ってテーブルのカラム情報を表示してみると、 old カラムが追加されていることが確認できました。

ALTER TABLE/カラムを追加する(5)

既存のデータの新しく追加されたカラムに格納されているデータを確認するため、あらためて SELECT コマンドを実行してみます。

ALTER TABLE/カラムを追加する(6)

既存のデータの新しいカラムの値はすべてデフォルト値である 20 が格納されていました。

カラムを削除する

テーブルから既存のカラムを削除するには次の書式を使用します。

ALTER TABLE name
   DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ]

テーブル( name )から既存のカラム名( column_name )のカラムを削除します。削除するカラムが外部キー制約やビューなどによって参照されている場合はエラーとなります。参照されている場合にも削除するには CASCADE を指定してください。

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみます。

\d friends

ALTER TABLE/カラムを削除する(1)

friends テーブルには id カラム、 name カラム、 address カラムが定義されています。それでは friends テーブルから address カラムを削除してみます。次のように実行してください。

alter table friends drop column address;

カラムを削除したあと、あらためて \d コマンドを使ってテーブルに含まれるカラムの情報を確認してみると、 address カラムが削除されていることが確認できました。

ALTER TABLE/カラムを削除する(2)

カラムのデータ型を変更する

テーブルで定義されている既存のカラムのデータ型を変更するには次の書式を使用します。

ALTER TABLE name
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
      [ COLLATE collation ] [ USING expression ]

テーブル( name )の既存のカラム名( column_name )のカラムのデータ型を新しいデータ型( data_type )に変更します。格納済みのデータについて、デフォルトでは古いデータ型から新しいデータ型への代入キャストが行われます。必要であれば USING 句を使用して変換方法を指定してください(あとで試します)。

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみます。

\d friends

ALTER TABLE/カラムのデータ型を変更する(1)

friends テーブルにはデータ型が integer の id カラムと、データ型が varchar(10) の name カラムが定義されています。それでは friends テーブルの name カラムのデータ型を text に変更してみます。次のように実行してください。

alter table friends alter name type text;

データ型を変更したあと、あらためて \d コマンドを使ってテーブルに含まれるカラムの情報を確認してみると、 name カラムのデータ型が text に変更されていることが確認できました。

ALTER TABLE/カラムのデータ型を変更する(2)

-- --

カラムのデータ型を変更するとき、データ型によっては ERROR: 列"name"は型integerには自動的に型変換できません のようなエラーが表示される場合があります。

ALTER TABLE/カラムのデータ型を変更する(3)

この場合にはコマンドを実行するときに USING 句を使ってください。例えば次のように実行します。

alter table friends alter name type integer using name::integer;

ALTER TABLE/カラムのデータ型を変更する(4)

今度はデータ型を変更することができました。なお USING 句を使っても、既に格納されているデータによってはデータ型の変換をするときにエラーが発生する場合があります。

制約の追加と削除

テーブルやカラムに対して制約を追加したり設定されている制約を削除するには次の書式を使用します。

DEFAULT 制約の追加と削除:

ALTER TABLE name 
    ALTER [ COLUMN ] column_name SET DEFAULT expression

ALTER TABLE name 
    ALTER [ COLUMN ] column_name DROP DEFAULT

NOT NULL 制約の追加と削除:

ALTER TABLE name
    ALTER [ COLUMN ] column_name SET NOT NULL

ALTER TABLE name
    ALTER [ COLUMN ] column_name DROP NOT NULL

カラムへ IDENTITY を追加と削除:

ALTER TABLE name
    ALTER [ COLUMN ] column_name 
      ADD GENERATED { ALWAYS | BY DEFAULT } 
      AS IDENTITY [ ( sequence_options ) ]

ALTER TABLE name
    ALTER [ COLUMN ] column_name 
    { SET GENERATED { ALWAYS | BY DEFAULT } | 
      SET sequence_option | 
      RESTART [ [ WITH ] restart ] } [...]

ALTER TABLE name
    ALTER [ COLUMN ] column_name DROP IDENTITY

CHECK 制約の追加と削除:

ALTER TABLE name
    ADD [CONSTRAINT constraint_name] CHECK ( expression ) [ NO INHERIT ]

ALTER TABLE name
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]

PRIMARY KEY 制約の追加と削除:

ALTER TABLE name
    ADD [CONSTRAINT constraint_name] PRIMARY KEY ( column_name [, ... ] )

ALTER TABLE name
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]

UNIQUE 制約の追加と削除:

ALTER TABLE name
    ADD [CONSTRAINT constraint_name] UNIQUE ( column_name [, ... ] )

ALTER TABLE name
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]

実際に試してみます。現在 friends という名前のテーブル名が作成されています。 psql メタコマンドの \d コマンドを使ってテーブルに含まれるカラムの情報を表示してみます。

\d friends

ALTER TABLE/制約の追加と削除(1)

最初に friends テーブルの id カラムに PRIMARY KEY 制約を追加してみます。次のように実行してください。

alter table friends add primary key (id);

ALTER TABLE/制約の追加と削除(2)

\d コマンドで確認してみると、 id カラムに PRIMARY KEY 制約が設定されていることが確認できます。

次に friends テーブルの name カラムに DEFAULT 制約を追加してみます。次のように実行してください。

alter table friends alter name set default 'NoName';

ALTER TABLE/制約の追加と削除(3)

\d コマンドで確認してみると、 name カラムに DEFAULT 制約が設定されていることが確認できます。

最後に先ほど追加した PRIMARY KEY 制約を削除します。次のように実行してください。

alter table friends drop constraint friends_pkey;

ALTER TABLE/制約の追加と削除(4)

\d コマンドで確認してみると、 id カラムに設定されていた PRIMARY KEY 制約が削除されていることが確認できます。なお PRIMARY KEY 制約を設定した時に自動で設定されて NOT NULL 制約は残ったままなので、必要に応じて NOT NULL 制約を削除してください。

-- --

ALTER TABLE コマンドを使って作成済みのテーブルを変更する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。