Oralce テーブルのカラムの順番を入れ替える

 今日も見に来てくださってありがとうございます。石川さんです。

 今日は、Oracleにおいてのテーブルのカラムの順番を入れ替える方法について書いておきます。昔だと、テーブル再作成してデータを入れ直す、という方法しかなかったのですが、別のやり方もあります、というお話です。Google先生に聞いたら、新しいやり方については簡単に出てこなかったので、周知しなければ、というモチベーションです。(笑)

Invisibleにして、Visibleにする

 結論を先に知りたい人のために、項目をInvisibleにして、visibleに設定し直すと、項目がテーブルの最後に移動します。この特性を使って順番を入れ替える、ということになります。

-- テーブルを作成します。POIに意味はありませんが、キーボード上に並んでいて、「ポイ」という感じが気に入っていてテストのときによく使っています。
SQL> create table poi (
  2    a number,
  3    b number,
  4    e number,
  5    d number
  6  );

表が作成されました。

-- 「C」列を追加し忘れました。よく見ると「E」「D」の列の順番も間違っていました。
SQL> desc poi
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER
 E                                                  NUMBER
 D                                                  NUMBER

-- 「C」列を追加します。
SQL> alter table poi add (c number);

表が変更されました。

-- 確認すると、最後に追加されています。
SQL> desc poi
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER
 E                                                  NUMBER
 D                                                  NUMBER
 C                                                  NUMBER

-- 「E」「D」列を「invisible」に設定します。
SQL> alter table poi modify ( e invisible, d invisible );

表が変更されました。

-- 確認すると、確かに「E」「D」列が見えなくなっています。ちなみにこの状態でINSERT INTO POI VALUES ( 1, 2, 3 );を実行すると、見えない列はNULLになりました。
SQL> desc poi
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER
 C                                                  NUMBER

-- 順番が大事ですので、まずは「D」列を見えるようにします。
SQL> alter table poi modify ( d visible );

表が変更されました。

-- そして、次に「E」列を見えるようにします。
SQL> alter table poi modify ( e visible );

表が変更されました。

-- 確認すると、順番が正しく入れ替わりました。
SQL> desc poi
 名前                                      NULL?    型
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  NUMBER
 C                                                  NUMBER
 D                                                  NUMBER
 E                                                  NUMBER

SQL> insert into poi values ( 1, 2, 3, 4, 5 );

1行が作成されました。

-- INSERT文を実行するときに項目を省略してみましたが、入れ替わった順番どおり値がセットされていました!
SQL> select * from poi;

         A          B          C          D          E
---------- ---------- ---------- ---------- ----------
         1          2          3          4          5

経過: 00:00:00.01
SQL>

 テーブルの項目をInvisibleに設定するオプションですが、Oracle 12cから登場したようです。これを実行すると文字通り見えなくなります。

追記:開発中のテーブルで実際に項目追加が必要になってやってみましたが、VISIBLEに設定するのは手抜きして以下のように一気にやっても順番通りに戻りました。

alter table poi modify ( e visible, d visible );

まとめ

 Oracleのテーブルのカラム定義の順番を入れ替えるのに、かつては再作成とデータ投入が必要でしたが、ALTER TABLE文だけで項目が入れ替えられるようになっていました!権限やインデックス、データ投入など、必要な手間を考えると圧倒的にこちらのほうが良い気がします。