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_dbを
sample_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 | インポート元のファイル形式を指定します。 |
| HEADER | CSVファイルにヘッダー行があることを示し、インポート時に最初の1行を無視します。 |
Postgresのデータベースのコピー方法
【コマンド実施個所】
psqlプロンプト
【エクスポート】
\COPY <テーブル名> TO 'file_path' DELIMITER ',' CSV HEADER;
【エクスポート】
\COPY <テーブル名> FROM 'file_path' DELIMITER ',' CSV HEADER;
【その他】
違いは、FROM,TOのみとなります。
