別のデータベースからいくつかのデータを転送する必要があります。古いデータベースはPaw1.moviesDBと呼ばれ、新しいデータベースはPaw1です。各テーブルのスキーマは次のとおりです。
Awards (name of the table)(new DB)
Id [PK] Serial Award
Nominations (name of the table) (old DB)
Id [PK] Serial nominations
古いデータベースから新しいデータベースにデータをコピーするにはどうすればよいですか?
私はちょうどこの正確なことをしなければならなかったので、私はここにレシピを投稿すると思いました。これは、両方のデータベースが同じサーバー上にあることを前提としています。
最初に、古いデータベースから新しいデータベースにテーブルをコピーします(明らかにデータベース間でデータを移動できないため)。コマンドラインで:
pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database>
# Just adding extra space here so scrollbar doesn't hide the command
次に、コピーしたテーブルのアクセス許可を新しいデータベースのユーザーに付与します。 psqlにログインします。
psql -U postgres -d <new_database>
ALTER TABLE <old_table> OWNER TO <new_user>;
\q
最後に、古いテーブルから新しいテーブルにデータをコピーします。新しいユーザーとしてログインしてから:
INSERT INTO <new_table> (field1, field2, field3)
SELECT field1, field2, field3 from <old_table>;
できた!
データベースはPostgreSQLで分離されています。 1つのデータベースのみに接続するPostgreSQLサーバーに接続する場合、SQLクエリを使用して、あるデータベースから別のデータベースにデータをコピーすることはできません。
MySQLから来た場合:MySQLが(大まかに)「databases」と呼ぶものは「schemas "PostgreSQLでは-名前空間の種類。 PostgreSQLデータベースには多くのスキーマがあり、各スキーマにはテーブルとビューがあり、schema.table
構文を使用して、あるスキーマから別のスキーマにコピーできます。
本当に2つの異なるPostgreSQLデータベースがある場合、一方から他方にデータを転送する一般的な方法は、テーブルを( pg_dump -t
で)ファイルにエクスポートすることです。それらを他のデータベースにインポートします(psql
を使用)。
別個のPostgreSQLデータベースからデータを本当に取得する必要がある場合、Grant Johnsonの回答で言及されている別のオプションは dblink です。これは追加モジュール(contrib/
) 。
これは、ローカルホストからHerokuのpostgresqlにテーブルをリモートでコピーするのに役立ちました。
pg_dump -C -t source_table -h localhost source_db | psql -h destination_Host -U destination_user -p destination_port destination_db
これにより、テーブルが作成されます。
他の方向(Herokuからローカルへ)pg_dump -C -t source_table -h source_Host -U source_user -p source_port source_db | psql -h localhost destination_db
From:hxxp://dbaspot.c om/postgresql/348627-pg_dump-t-give-where-condition.html(注:リンクは現在壊れています)
# create temp table with the data
psql mydb
CREATE TABLE temp1 (LIKE mytable);
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions;
\q
# export the data to a sql file
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql
psql mydb
DROP TABLE temp1;
\q
# import temp1 rows in another database
cat out.sql | psql -d [other_db]
psql other_db
INSERT INTO mytable (SELECT * FROM temp1);
DROP TABLE temp1;
リモートで役立つ別の方法
# export a table csv and import in another database
psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER;
$ scp Host.com:/tmp/elements.csv /tmp/elements.csv
psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV;
これが1回限りの場合、コピーには3つのオプションがあります。
これが継続的なニーズである場合、答えは次のとおりです。
実際、あるPostgreSQLデータベースから別のデータベースにテーブルデータを送信する可能性があります。私は、手続き言語plperlu(安全でないPerl手続き言語)を使用します。
説明(すべてLinuxサーバーで行われました):
データベースAにplperlu言語を作成します
その後、PostgreSQLは、データベースAのpostgresql.confの最後にある一連の次のコマンドを使用して、いくつかのPerlモジュールに参加できます。
plperl.on_init='use DBI;'
plperl.on_init='use DBD::Pg;'
次のようにAで関数を作成します。
CREATE OR REPLACE FUNCTION send_data( VARCHAR )
RETURNS character varying AS
$BODY$
my $command = $_[0] || die 'No SQL command!';
my $connection_string =
"dbi:Pg:dbname=your_dbase;Host=192.168.1.2;port=5432;";
$dbh = DBI->connect($connection_string,'user','pass',
{AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,}
);
my $sql = $dbh-> prepare( $command );
eval { $sql-> execute() };
my $error = $dbh-> state;
$sql-> finish;
if ( $error ) { $dbh-> rollback() } else { $dbh-> commit() }
$dbh-> disconnect();
$BODY$
LANGUAGE plperlu VOLATILE;
そして、データベースA内の関数を呼び出すことができます。
SELECT send_data( 'INSERT INTO jm (jm) VALUES (''zzzzzz'')' );
また、値「zzzzzz」がデータベースBのテーブル「jm」に追加されます。
SQL Serverのようなデータベース間クエリを実行することはできません。 PostgreSQLはこれをサポートしていません。
PostgreSQLのDbLink拡張機能は、あるデータベースを別のデータベースに接続するために使用されます。クロスデータベースクエリを実行するようにDbLinkをインストールして構成しました。
PostgreSQLでクロスデータベースクエリを実行するためのステップバイステップスクリプトと例を既に作成しました。この投稿をご覧ください:PostgreSQL [ビデオ]:DbLink拡張機能を使用したデータベース間クエリ
Leonbloyが提案したように、データベースで2つのスキーマを使用する方法があります。 ソーススキーマ(古いDB)とターゲットスキーマ(新しいDB)の場合、次のようなものを試すことができます(列名、タイプなどを考慮する必要があります):
INSERT INTO target.Awards SELECT * FROM source.Nominations;