おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【PostgreSQL】テーブルをコピーしたらindexや制約がコピーされないぞ?

過去データの取り込み作業でテーブルにデータを流し込む作業をしているのだけど、念のためのバックアップを作って何かあれば戻せるように準備していたのだが、indexや制約がコピーされてないことに気づき調査開始。

単純にコピー作って戻す方法(ダメな方法)

hoge=# CREATE TABLE shop_sales_back AS SELECT * FROM shop_sales;
hoge=# DROP TABLE shop_sales
hoge=# ALTER TABLE shop_sales_back RENAME TO shop_sales;

indexや制約を意識した方法(良い方法)

hoge=# CREATE TABLE shop_sales_back AS SELECT * FROM shop_sales;

#テーブルは消さずに、データだけ空っぽにする
hoge=# TRUNCATE TABLE shop_sales;
hoge=# INSERT INTO shop_sales (SELECT * from shop_sales_back);

テーブルは消さずに中身だけ削除! コピーしたテーブルから再度データを流し込むって感じですね。

また、別の方法としてテーブル定義の情報含めてpg_dumpしてリストアする方法がありそうなのだけど何がどう違うのか分かってないので、先輩に聞いてみよう。

pg_dumpしてリストアする方法

# ダンプ
$ pg_dump —username=user --table shop_sales hoge > hoge.sql

# リストア
$ psql —username=user hoge < hoge.sql

indexや制約を確認する方法

$ psql hoge

hoge=# \d table_name