Postgresでテーブル、データベースをコピーしよう

PostgreSQLでテーブル・データベースをコピーする方法

PostgreSQLで、既存のテーブルやデータベースをコピーしたい場合があります。 ここでは、元のデータを残したままコピーする方法を簡単に紹介します。

テーブルをコピーする

① テーブルとデータをまとめてコピー

新しいテーブルを作り、元のテーブルのデータも一緒にコピーする場合は、 CREATE TABLE ASを使います。

CREATE TABLE コピー先テーブル AS
SELECT *
FROM コピー元テーブル;

例えば、usersというテーブルを users_copyとしてコピーする場合は次のようにします。

CREATE TABLE users_copy AS
SELECT *
FROM users;
② データだけコピーする

すでにコピー先のテーブルがある場合は、 INSERT INTOを使ってデータをコピーできます。

INSERT INTO コピー先テーブル
SELECT *
FROM コピー元テーブル;

データベースをコピーする

③ データベースを複製する

PostgreSQLでは、既存のデータベースを元に新しいデータベースを作ることもできます。

CREATE DATABASE コピー先
WITH TEMPLATE コピー元;

例えば、sample_dbsample_db_copyとしてコピーする場合です。

CREATE DATABASE sample_db_copy
WITH TEMPLATE sample_db;
注意
データベースをコピーするときは、コピー元のデータベースに 接続しているユーザーがいるとコピーできない場合があります。 その場合は、いったん接続を切ってから実行してください。

まとめ

PostgreSQLでは、目的に応じて次のようにコピーできます。

テーブルとデータをコピー:
CREATE TABLE AS SELECT

データだけコピー:
INSERT INTO SELECT

データベースをコピー:
CREATE DATABASE ... WITH TEMPLATE

バックアップ目的やオリジナルのテーブルを変更しないで色々試したい時に使用します。
※主に長期利用(自分用に使いたい場合に実施)

【コマンド実施個所】
psqlプロンプトなど、SQLが実行可能なところで実施する

【手順】
①CREATE TABLE 新テーブル AS SELECT * FROM 既存テーブル; --全データをコピーがコピー可能
②PK,インデックス作成,not null制約作成等の追加する。

以下のようにすると、テーブル構造のみコピー可能(データは空となる)
①´CREATE TABLE 新テーブル AS SELECT * FROM 既存テーブル where 1 = 2;
※「1 = 2」など必ずfalseになるようにすると、データがコピーされない

Postgresのデータのコピー方法:エクスポート、インポート

こっちは、オリジナルのテーブルを変更する必要がある時に使用する。
やりたいことを実施した後に元に戻す場合に使用。
※主に短期利用

psqlを使って、CSV形式でデータをエクスポートします。

【コマンド実施個所】
psqlプロンプト

【エクスポート】
\COPY <テーブル名> TO 'file_path' DELIMITER ',' CSV HEADER;

【エクスポート】
\COPY <テーブル名> FROM 'file_path' DELIMITER ',' CSV HEADER;

【その他】
違いは、FROM,TOのみとなります。
オプション説明
テーブル名コピーしたいテーブル名を指定します。
file_pathファイルへの絶対パス。例)/tmp/table_name.csv
DELIMITER ‘,’データの区切り文字(デリミタ)を指定します。ここではカンマを指定しています。
CSVインポート元のファイル形式を指定します。
HEADERCSVファイルにヘッダー行があることを示し、インポート時に最初の1行を無視します。

Postgresのデータベースのコピー方法

【コマンド実施個所】
psqlプロンプト

【エクスポート】
\COPY <テーブル名> TO 'file_path' DELIMITER ',' CSV HEADER;

【エクスポート】
\COPY <テーブル名> FROM 'file_path' DELIMITER ',' CSV HEADER;

【その他】
違いは、FROM,TOのみとなります。