小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracleでテーブルの途中にカラム列を追加したい場合の対処方法


photo credit: drpavloff via photopin cc

はじめに

Oracleでは、既存のテーブルにカラム列を追加したい場合、末尾になら追加できます。カラム列の途中にあたらしいカラム列を追加することはできません。
ただし、テーブルを作り直すという力業を用いるとなんとか途中にカラム列を追加することができます。

Code TipsCode Tips
新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
小田 圭二 大塚 信男 五十嵐 建平 谷 敦雄 宮崎 博之 神田 達成 村方 仁
翔泳社
売り上げランキング: 188,690

テーブルの末尾にカラムを追加する

カラムの追加は、alter table文を使います。

create table table01
(
  id number,
  name varchar(50),
  furigana varchar(50),
  primary key( id )
);

このテーブルの末尾(furigana)の後ろに誕生日(birthday)カラムを追加する場合は、以下のコマンドを叩きます。

ALTER TABLE table01
ADD (
    birthday varchar(8) DEFAULT '        ' NOT NULL
);
途中にカラム列を追加する

既存のテーブルの途中にカラム列を追加する場合、以下の手順を踏みます。

  1. 既存のテーブル(table01)にあたらしいカラム列を追加した一時的なテーブル(TmpTable01)を作成します。
  2. table01内にあるデータをTmpTable01へコピーします。
  3. table01を削除します。
  4. TmpTable01をリネームして、table01とします。
  5. 最後にtable01についていたインデックスを張り直します。

はじめにtable01を作って、データを1件挿入します。

create table table01
(
  id number,
  name varchar(50),
  furigana varchar(50),
  primary key( id )
);

insert into table01(id, name, furigana) values(1, 'テスト 太郎', 'てすと たろう');
commit;

誕生日カラムを追加済みの一時テーブルを作成します。

create table Tmptable01
(
  id number,
  birthday varchar(8) NOT NULL,
  name varchar(50),
  furigana varchar(50),
  primary key( id )
);

table01内にあるデータをTmpTable01へコピーします。

insert into Tmptable01 (id, birthday, name, furigana)
 select id, '        ' as birthday, name, furigana from table01;
commit;

table01を削除します。

drop table table01;

TmpTable01をリネームして、table01とします。

rename tmptable01 to table01;

これでデータのコピーとカラム列の追加が完了です。
あとは、table01に必要なインデックスを追加します。