あるデータベースから別のデータベースにテーブルをコピーする最も簡単な方法は?


151

データベースが異なるユーザーの下にある場合に、あるデータベースのテーブルから別のデータベースのテーブルにデータをコピーするための最良の方法は何ですか?

私は使用できることを知っています

INSERT INTO database2.table2 SELECT * from database1.table1

しかし、ここでの問題は、両方のことですdatabase1し、database2別のMySQLユーザの下にあります。したがって、user1アクセスdatabase1のみ可能で、アクセスのみuser2可能ですdatabase2。何か案が?


6
ユーザーにテーブルレベルの権限を与えることができます。参照:dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
残念ながら、私はGodaddy共有ホスティングサーバーを使用しているため、これは私の場合には機能しません。彼らはデータベースでそのようなことをすることを許しません。
Sparky

@mmdemirbasデータベースの1つのテーブルには、ほぼ100万行があります。データベースのダンプは巨大になります。また、私がエクスポートしようとしたとき、おそらくサイズが大きいため、約10,000行しかエクスポートされていません。
Sparky

RENAMEを使用してテーブルを移動できることを知っています。テーブルをコピーする同等のトリックはありますか?
Dan

ところで:フィールドリストが両方のテーブルで同じ順序になっていることに注意する必要があります。それ以外の場合は、database1のテーブルから名前でフィールドを選択して、database2のテーブルの正しいフィールドにマップする必要があります。この問題は、table1が最初の作成後に変更されたデータベースと、mysqldumpファイルから作成された新しいデータベースをバックアップしたときに発生しました。
スティーブL

回答:


113

シェルアクセスがある場合はmysqldump、の内容をダンプし、database1.table1それをmysqlにパイプするために使用できますdatabase2。ここでの問題はそれtable1がまだtable1です。

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

多分あなたは別のクエリで名前を変更table1する必要がありtable2ます。もう1つの方法では、sedを使用して、toパイプ間でtable1をtable2に変更します。

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

table2がすでに存在する場合は、最初のmysqldumpにパラメータを追加して、テーブルを作成しないようにすることができます。

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

これの問題は、自動化されたときにパスワードを表示する必要があることです。自動化されておらず、ユーザーがコマンドラインから実行している場合は問題ありません。
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

ここで、db1は宛先で、db2はソースです。


2人のユーザーが互いにデータを選択する権限を持っていない場合、これは機能しますか?
ベリリウム2014年

1
これは別のmysqlサーバーでは機能しませんか?
PUG、2014年

8
これはインデックスをコピーしません
bcoughlan

@Berylliumいいえ、これにはユーザーが両方のDBに対する権限を持っている必要があります。jaminatorいいえ、これはさまざまなサーバー間では機能しませんが、質問はそれについて尋ねていたとは思いません。あなたは正しいです。これは、このアプローチの大きな欠点です。テーブル構造が適切に保持されません。
thomasrutter 2015

4
コピーされたテーブルには、主キーと自動インクリメントセットがありませんでした。あなたはこれを後で実行しなければなりませんALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

PHPMyAdminを使用している場合は非常に簡単です。次のデータベースがあるとします。

DB1 & DB2

DB1には、DB2にコピーするテーブルユーザーがあります。

PHPMyAdminでDB1を開き、usersテーブルに移動します。

このページで、右上の「操作」タブをクリックします。[操作]で、[ テーブルのコピー先(database.table)]セクションを探します。

これで完了です。


1
とてもシンプル!これは私が怠惰であることを祝うことができるときです!
Daniel Dut

1
あなたは私の時間を節約します。私は素朴なアプローチをしていました。最初にエクスポートしてからインポートしました。
Hamza Zafeer 2016年

1
他の答えはどれも機能せず、インデックスもコピーするあなただけのものです
Bsienn

1
テーブルが特に大きい場合、つまり4 GBを超える場合、これは機能しません。たとえば、phpMyAdminで使用できない22GBのテーブルがあります。
マークD

1
完璧な答え。phpmyadminのこの機能については知りませんでした。
zookastos 2017

23

MySql Workbench:強く推奨

MySql Workbenchからのデータベース移行ツール

これは移行の問題を簡単に処理します。MySqlとSqlServerの間で、選択したデータベースの選択したテーブルを移行できます。是非試してみてください。


私はこれを試してみるつもりです、私はそれをセットアップしていますが、mysql Workbench移行をSQLYogのデータベースコピーと比較したかどうか疑問に思いますか?私の簡単な見た目から、それらは非常に似ているようですが、mysqlワークベンチは新しい機能です
Wired00

いいえ、SQLYogは試しませんでした。
mmdemirbas 2014

MySqlワークベンチを使用してMySQLからSQL Serverに移行する方法は明らかではありません。私はWorkbenchにいて、ヘルプやUIからの手掛かりを見つけることができません。SSMA for MySQLが機能することは知っています。
subsci 2014

2
興味深いことに、プログラムは大規模なデータベースを使用して移行を行ったので、コマンドラインが最適に機能しました。
Claudionor Oliveira

1
@mmdemirbas、「選択したデータベースの選択したテーブルをMySqlとSqlServerの間で移行できます。」ただし、OPの問題はSQL Serverに関するものではありません。
sampablokuper 2017年

19

Navicat for MySQLを使用しています...

すべてのデータベース操作が簡単になります!

Navicatで両方のデータベースを選択して使用するだけです。

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

私はこれが古い質問であることを知っています、ここに着く誰もがより良いアプローチを得るために答えるだけです。

5.6.10以降では、

CREATE TABLE new_tbl LIKE orig_tbl;

こちらのドキュメントを参照してください:https : //dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
データはコピーされません!参照したドキュメントを読みます。> ** CREATE TABLE ... LIKEはデータを保持しません**
dgpro

11

テーブルが同じmysqlサーバー上にある場合、次を実行できます

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

他のインデックスはどうですか?質問は、データだけでなくテーブルをコピーすることを述べています
ジョルジ

9

MySql Workbenchのエクスポートおよびインポート機能を使用します。手順:
1.必要な値を選択します

E.g. select * from table1; 
  1. [エクスポート]ボタンをクリックして、CSVとして保存します。
  2. 最初のものと同様の列を使用して新しいテーブルを作成する

    E.g. create table table2 like table1; 
  3. 新しいテーブルからすべてを選択

    E.g. select * from table2;  
  4. [インポート]をクリックして、ステップ2でエクスポートしたCSVファイルを選択します

MySql Workbenchの[Export]および[Import]ボタンのサンプル


1
それは私が思う10億行未満のテーブルでのみ機能します。
Diogo Paim 2016

9

ここに別の簡単な方法があります:

  1. DB1を使用します。show create table TB1;
    • ここに構文をクリップボードにコピーして、DB2にTB1を作成します
  2. DB2を使用します。
    • ここに構文を貼り付けてテーブルTB1を作成します

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


これにより、GUIプログラムを使用せずに、データベースのコピーを自動化できました。
New2HTML

4

試してみてくださいmysqldbcopyドキュメント

または、ターゲットホスト上に「連合テーブル」を作成できます。連合テーブルを使用すると、ローカルのテーブルのように、別のデータベースサーバーのテーブルを表示できます。(ドキュメント

連合テーブルを作成した後、通常の方法でデータをコピーできます insert into TARGET select * from SOURCE


1
連合テーブルについて読みましたが、Amazon RDS(現在)はサポートしていません... XP
Chococroc '28 / 10/28

4

MySQL Workbenchでは、データエクスポートを使用してテーブルのみをローカルSQLファイル(データのみ、構造のみ、または構造とデータ)にダンプし、データインポートを使用して他のDBにロードできます。

複数の接続(異なるホスト、データベース、ユーザー)を同時に開くことができます。


3

必要なすべてのクエリを取得する簡単な方法の1つは、information_schemaとconcatのデータを使用することです。

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

次に、次のような結果のリストを取得します。

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

その後、これらのクエリを実行できます。

ただし、MySQLビューでは機能しません。AND TABLE_TYPE = 'BASE TABLE'最初のクエリから追加することでそれらを回避できます:


1

これはあなたが定期的に行う必要があるものですか、それとも1回だけですか?

テーブルとその内容をテキストファイルに書き出すエクスポート(phpMyAdminなどを使用)を実行してから、他のデータベースに再インポートできます。


私はそれを一度だけする必要があります。しかし、問題はデータベースのテーブルがほぼ100万行あることです。データベースのダンプは巨大になります。また、私がエクスポートしようとしたとき、おそらくサイズが大きいため、約10,000行しかエクスポートされていません。
Sparky

ああ、それは制限です。このWordPress Codexの記事は役に立ちますか?これはワードプレスの記事ですが、ある程度の洞察が得られるかもしれません(phpMyAdminで処理するにはDBが大きすぎる場合に、コマンドラインを使用してテーブルをダンプする方法に関するセクションがあります)。
Sepster

mysqldumpコマンドラインツールは、100万行または数十億行の問題はありません。影響するのは、所要時間と結果が占めるハードドライブの量です(ファイルに出力した場合)。phpMyAdminのエクスポートコマンドに関する私の経験は、mysqldumpよりもはるかに制限されているということです。
thomasrutter 2015

1

以下の手順を使用して、いくつかの列を1つのデータベーステーブルから別のデータベーステーブルにコピーおよび挿入します。

  1. CREATE TABLE tablename(columnname datatype(size)、columnname datatype(size));

2.INSERT INTO db2.tablename SELECT columnname1、columnname2 FROM db1.tablename;


1

最初にダンプを作成します。すでに存在する--no-create-info --no-create-db場合、フラグを追加しましたtable2

mysqldump -u user1 -p database1 table1 > dump.sql

次に、user1パスワードを入力します。次に:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

次に、user2パスワードを入力します。

@helmorsの回答と同じですが、パスワードがコンソールに未加工のテキストで公開されないため、アプローチはより安全です(reverse-i-search、パスワードスニファなど)。他のアプローチは、スクリプトファイルから実行され、そのアクセス許可に適切な制限が課されている場合は問題ありません。


0

IN xamppは必要なテーブルを.sqlファイルとしてエクスポートし、それを必要なテーブルにインポートするだけです


-1

sakila.customer(Database_name.tablename)のようなテーブルdestination_customerを作成します。これにより、ソーステーブルの構造のみがコピーされます。データも構造とともにコピーされます。これ行うには、次のようにしてください。select * from sakila.customer


これはまったく別の質問に対する答えのようです。CREATE TABLE LIKE質問には何もないので、なぜそれが間違っていると言及するのですか?そしてこの回答がどちらのユーザーも他方のテーブルにアクセスできないという問題をどのように解決するについての説明はありません。
Toby Speight
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.