他人が作った SQL Server を使う VB.NET のソースを修正していたら、
SELECT TOP 0 * INTO new_hoge FROM org_hoge
みたいな SQL を発行してるんで、「0行だけ取ってきて新しいテーブルにインサートって何?」って思ったら、これ、定義だけコピって新しいテーブルを作る方法なんじゃね。
へえ、SQL Server じゃこんなことできるんだ・・・と思って、PostgreSQL で同じように、
SELECT * INTO new_hoge FROM org_hoge LIMIT 0 OFFSET 0
ってやってみたら、org_hoge の定義で新しい空のテーブル new_hoge が作られた。
「へえ」と。俺は職業プログラマなので、他のテーブルと同じ定義で空のテーブルを作るときも、ちゃんと CREATE TABLE 文を書いて作ってた。どっちみち、設計資料として必要だしね。それに、たまたまこの長い人生の中で、プログラム内で(例えばワークテーブルを作るとか?)こういうことをする機会も無かったので、こんな簡単な方法知らなかったよ(笑)
知っている人にとっては「なんだ、そんな簡単なこと!」なんだろうけど(笑)
で、MySQL でも、
SELECT * INTO new_hoge FROM org_hoge LIMIT 0,0
とやってみたら、これは
ERROR 1327 (42000): Undeclared variable: new_hoge
とエラーになった。new_hoge は宣言されてねえぞ・・・って?
調べてみると、MySQL では SELECT * INTO TABLE <新しいテーブル>・・・という書き方はサポートされていなかった。マニュアルには、
INSERT INTO new_hoge SELECT * FROM org_hoge LIMIT 0,0
にしろ・・・と書いてあるらしいが、そもそも MySQL にはこういう方法での CREATE TABLE 機能は無いそうで、この場合も「new_hoge なんてテーブルは無ぇよ!」と怒られるらしい。
結局、MySQL では「SELECT した情報で空のテーブルを新しく作る」ということはできないようだ。
素直に、
CREATE TABLE new_hoge LIKE org_hoge
でテーブルを作りなさいということだね。
他の DBMS ではどうなのかは面倒くさいので調べていない(笑)
コメントする