PostgreSQLでデータベース・テーブルをコピーする方法まとめ
PostgreSQLを使っていて、以下のような場面でデータや構造をコピーしたいケースは多いと思います。
- テーブルのバックアップを取りたい
- テスト用DBを本番から複製したい
- スキーマ間でデータを移動したい
本記事では、以下の2つのケースについて解説します。
- ✅ データベース単位のコピー
- ✅ テーブル単位のコピー(スキーマ間を含む)
1. コマンドプロンプトでファイルの移動
コピーの操作については、コマンドを実行します。そのさいに、PostgreSQL
のbinフォルダ
にパス(環境変数の設定)が通っている必要があります。
もし通っていない場合、cd
コマンドでbinフォルダまで移動します。
cd C:\Program Files\PostgreSQL\16\bin
2. データベースのコピー方法(pg_dump → psql)
2-1. ダンプファイルを作成
🔧 基本構文
pg_dump -U <ユーザー名> -d <データベース名> -f "<出力先の絶対パス>\<ファイル名>.sql"
💡 使用例
pg_dump -U postgres -d testdb -f "C:\dump\testdb_dump.sql"
✅ ポイント
- -U postgres: ユーザー名
- -d testdb: コピー元のDB名
- -f: 出力ファイル(フルパスで指定)
- ⚠ 出力フォルダに書き込み権限があるかも確認。アクセス拒否エラーが出る場合は、ユーザーディレクトリ直下などの安全なパスを指定
2-2. 新しいデータベースを作成
🔧 CREAT文
createdb -U postgres testdbbk
2-3. ダンプを新しいDBにリストア
🔧 基本構文
psql -U <ユーザー名> -d <2-2.で作成したデータベース名> -f "<2-1.で出力したdumpファイルを格納している場所の絶対パス>"
💡 使用例
psql -U postgres -d testdbbk -f "C:\dump\testdb_dump.sql"
✅ ポイント
- -U postgres: ユーザー名
- -d testdb: コピー元のDB名
- -f: 出力ファイル格納場所(フルパスで指定)
3. テーブルのコピー方法
3-1. テーブル定義・インデックス・制約込みで複製
🔧 CREATE文
CREATE TABLE <コピー先テーブル名> (LIKE public.<コピー元テーブル名> INCLUDING ALL);
💡 使用例
CREATE TABLE public.testtable_bk (LIKE public.testtable INCLUDING ALL);
✅ ポイント
-
INCLUDING ALL
を使うと、カラム定義・デフォルト値・NOT NULL 制約・CHECK制約・インデックスなど全て含まれる
3-2. データをコピー
🔧 INSERT文
INSERT INTO <コピー先テーブル名> SELECT * FROM <コピー元テーブル名>;
💡 使用例
INSERT INTO public.testtable_bk SELECT * FROM public.testtable;
✅ まとめ
方法 | 内容 |
---|---|
pg_dump + psql
|
DBをまるごとバックアップ・リストアする |
CREATE TABLE ... LIKE |
テーブル定義を丸ごとコピーする |
INSERT INTO ... SELECT |
テーブルデータのみをコピーする |