定義だけコピーして空の新しいテーブルを作る方法[データベース]
(2022-02-03 13:25:10) by shinoda


他人が作った 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 ではどうなのかは面倒くさいので調べていない(笑)


コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8