rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【Oracle】既存テーブルの項目定義流用してテーブルCreateだけする(WHERE句に0=1つける)

あるテーブルをつくる(Createする)とき、既存テーブルの項目定義情報をそのまま流用したいときがある。
そのとき、いちいち流用したいテーブルの項目定義調べてCreate文書くのが面倒だったりするので、
Select+Createの要領で、かつ「絶対に結果が返ってこない条件」を意図的に書くことで、
テーブルの項目定義を簡単に流用することができる。


 
たとえばとあるテーブルTEST_TABが

create table TEST_TAB (
    NO NUMBER(10)
   ,FIRST_NAME VARCHAR2(30)
   ,FAMILY_NAME VARCHAR2(30)
   ,BIKO VARCHAR2(30)
   ,PARENT_NO NUMBER(10)
)



だったとして、
これを流用する(とりあえず項目抜粋して「NO」「FIRST_NAME」「FAMILY_NAME」「BIKO」だけ)としたとき


create table TEST_TAB2 as select no ,first_name ,family_name ,biko from TEST_TAB where 0=1


とすると、「TEST_TAB」の「NO」「FIRST_NAME」「FAMILY_NAME」「BIKO」の項目定義をそのまま流用して
件数0件の空っぽのテーブルだけをとりあえずCreateすることができる。
WHERE句に書いた「0=1」は絶対falseになる(イコールになるわけない)ので、
流用元のテーブル(ここでいう「TEST_TAB」)に例え何万件、何億件入っていようが、このSELECTの結果は0件になる。
ただしSELECTと同時に項目情報だけはテーブルからとってきているので、それを使ってテーブルを新規構成する、というやり方。
「中身のデータはいらないがとりあえずテーブルの外枠だけ作っておきたい」というときに使える。

WHERE句に書く条件はfalseになることが保障されていれば別に「0=1」にこだわらなくてもいい。
「0=1」を個人的に一番よく使うってだけである。
「'A'='B'」とかでもいいだろう。
好きな書き方すればいいと思う。

WHERE句の条件を取り除くか、あるいは特定の条件だけ抽出するよう記述すれば、
テーブルのCreateと同時にデータの格納も可能となる。
(というか↑で挙げた方法は0件のテーブルをまず作りたいときに使う、これのただの応用である)

ただしこの方法だと、流用元のテーブルについてるPK(Primary Key)やINDEXの定義はついてこない。
あくまでテーブル項目定義だけを流用してCreateするだけである。
「とりあえず手っ取り早くテーブルだけ作りたい」というときに有効な方法ということになる。