テーブル構造を新しいテーブルにコピーします


91

すべてのキーと制約を含むデータなしで、テーブルの構造を新しいテーブルにコピーする方法はありますか?

回答:


106

単純なスキーマコピーの場合は、like句を使用します。

CREATE TABLE new_table_name ( like old_table_name including all)

13
価値があるような構文を使用しているときにも、新しい列を追加することができます注意すること:CREATE TABLE new (like old, extra_column text);
ブラッド・コッホ

@BradKochこのステートメント内に制約を追加することは可能ですか?それとも別のものにする必要がありますか?
アンドレイデイネコ

@AndreyDeineko状況によって異なりますが、詳細については、テーブル作成に関するドキュメントを確認してください。他のcreateステートメントと同じように、この構文を使用してチェック制約と外部キー制約を簡単に追加できますが、null以外のような列レベルの制約を後続の変更なしで適用できるかどうかはわかりません。
ブラッドコッホ

2
今試してみました。外部キー制約とトリガーをコピーしませんでした(PostgreSQL9.2)。
ジャニスElmeris

73

さて、SQLで取得できる最も近いものは次のとおりです。

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

しかし、すべてをコピーするわけではありません。欠落している最も重要なものは外部キーです。また、トリガーもコピーされません。他のことについてはよくわかりません。

もう1つの方法は、テーブル構造をダンプし、dumpで名前を変更して、再度ロードすることです。

pg_dump -s -t old databases | sed 's/old/new/g' | psql

ただし、このような単純なsedは、他の場所でも古いものから新しいものに変わることに注意してください(たとえば、テーブルの列に「is_scolded」という名前がある場合は、「is_scnewed」になります)。

問題はむしろ、なぜそれが必要なのかということです。さまざまな目的のために、私はさまざまな手法を使用するからです。


注:including constraintsPostgreSQL 8.3では機能しません
Ragnar123 2011年

1
Postgres9.3でチャームのように機能しました:)
Ganapathy 2014

14
ベストアンサー。「シリアル」値またはデフォルトでシーケンスに設定されている他の列がある場合は、古いテーブルと同じシーケンスが使用されることに注意してください。したがって、どちらかのテーブルにデータを挿入すると、両方のテーブルが増加します。
sudo 2016

19

テーブルを完全にコピーするには、TABLEコマンドを使用した短い形式も使用できます。

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

詳細はこちら


残念ながら、これはデータもコピーします
ジャスミン

🙁IDは新しいテーブルではNULLであり、デフォルト値をコピーしません。
ilhan

10

pgAdminを見てください-あなたがやりたいことをする最も簡単な方法です。
テーブルを右クリックし、スクリプト-作成します。


私はphpPgAdminにしかアクセスできません。私はサーバーを所有していません。
Alex S

けっこうだ。phpPgAdminで:テーブルに移動し、[エクスポート]をクリックして、[構造のみ]を選択すると、スクリプトが作成されます
ChssPly76 2009

このインストールではバグであるに違いないと確信しています。これを行うと、右側のフレームに空白のページが表示されます:/
Alex S

1
「表示」または「ダウンロード」の両方のオプションを試しましたか?両方が機能しない場合は、はい、それはバグである可能性があります。もしそうなら、あなたはSQLを介してそれを行う必要があるでしょう、Davの答えのリンクを見てください。
ChssPly76 2009

ダウンロードすると空のファイルが表示されます。
Alex S

6

どうですか

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

postgresql.orgの回答


3
残念ながら、これはキー、制約、またはデフォルトを保持しません。
sudo 2016

1
'WHERE 1 = 2'を表現するより良い方法は、 'WHERE false'またはWHERE句をまったく使用しないことですが、代わりに 'LIMIT0'です。
Kenyakorn Ketsombut 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.