0

少し問題があります。2つのMySQLデータベースがあり、すべてのテーブルを一方から他方に移動したいのですが、通常のPHPMyAdminエクスポートを使用すると、ID列が原因でエラーが発生します。PHPMyAdminでその1つのテーブルをコピーしない場合を除いて、データベース全体を他のデータベースにコピーするにはどうすればよいですか?また、テーブルがたくさんあるので、手動でテーブルをコピーすることはできません。これには、データベース内のすべてのテーブルのループが含まれる可能性があることを私は知っています。誰かがそれを行う方法を知っていますか(PHPを使用していれば大丈夫です)?
すべてのテーブルの構造はまったく同じであり、次の構造に従います。

id int NOT NULL AUTO_INCREMENT, # The one I don't want to copy (it is also a primary key)
col1 varchar(5), # Want to copy all of these.
col2 varchar(15),
col3 varchar(1000),
col4 varchar(20)

id私がやりたいのは、各エントリの列をコピーしないことを除いて、あるデータベースから別のデータベースにすべてのテーブルをコピーすることです。したがって、たとえば、1つのエントリを手動で追加する場合は、を使用CREATE TABLE IF NOT EXISTS mytable ...してから、を使用しINSERT INTO mytable (col1, col2, col3, col4) VALUES (value1, value2, value3, value4)ます。id列を挿入していないことに注意してください。

4

7 に答える 7

1

PHP スクリプトを作成してすべてのテーブルを取得し、ループして新しいテーブルに挿入することができます。構造が同じであれば、それらすべてをコピーする方が簡単なはずです。ここにアイデアがあります:

すべてのテーブルを取得

$sql = "SHOW TABLES FROM DB1";
$query = mysql_query($sql);    

// save the result as $old_tables

$sql = "SHOW TABLES FROM DB2";
$query = mysql_query($sql);    

// save the result as $new_tables

結果をループして他のテーブルに挿入し、存在しない場合は作成します。

foreach($old_tables as $table){
    if(!in_array($table, $new_tables)){
        // create table with the name $table in DB2
    }

    $sql = "INSERT INTO DB2.$table(col1, col2, col3, col4) SELECT col1, col2, col3, col4 FROM  DB1.$table";
    mysql_query($sql);
}

最も簡単な方法は、SQLYog、Navicat などの DB 管理ツールを使用することです。

于 2012-11-27T00:48:52.320 に答える
1
select concat( 'INSERT INTO destination_db.destintation_table 
(col1, col2, col3, col4)
SELECT col1, col2, col3, col4 FROM ',a.table_name,';' )
from information_schema.tables a 
where a.table_name like 'table_prefix_%';

すべてのテーブルにプレフィックスがあると仮定して実行するコードを提供する必要がありますか? 戻ってきたら、返されるクエリを実行します

于 2012-11-20T08:55:11.633 に答える
0

OK、これはクレイジーなアプローチです。

1) MySQL データベースのダンプを作成します

mysqldump -h localhost -u <user> -p<password> <database> > dump.sql

2)Vimでdump.sqlを開き、すべてのテーブルの名前の後に(col1、col2、col3、col4)を追加します

vim dump.sql
:%s/INSERT INTO `\(.*\)`/INSERT INTO `\1`(col1, col2, col3, col4)/g

3) ここで、各行の ID である VALUES の後の最初の値を削除します。

:%s/VALUES (\d\+,/VALUES (/g

4) ダンプからコピーしたくないすべてのテーブルを削除します。ダンプを宛先データベースに適用します。

于 2012-11-24T15:12:49.133 に答える
0

「Navicat for MySQL」を使用して、データベース間であらゆる種類のデータをコピーしました。ユースケースにうまく機能するようです。クロスデータベースのデータ管理に関しては、Navicat は非常に柔軟です。30 日間の試用版をダウンロードして試してみて、効果があるかどうかを判断してください。http://www.navicat.com

注: 私は Navicat で働いていません...私は満足している顧客です。

于 2012-11-26T20:04:18.687 に答える
0

これが私の解決策です-PHPはsudoersで構成する必要があります

<?php

// Dump and recover 

system("mysqldump -u root -ppassword -h localhost --ignore-table=my_db_name.my_table_name1 --ignore-table=my_db_name.my_table_name2 my_db_name | mysql -u root -ppassword -h remote_host my_db_name");

PHPが必要ない場合は、シェルでこのコマンドラインだけを実行できます

mysqldump -u root -ppassword -h localhost --ignore-table=my_db_name.my_table_name1 --ignore-table=my_db_name.my_table_name2 my_db_name | mysql -u root -ppassword -h remote_host my_db_name
于 2012-11-27T03:43:17.837 に答える
0

両方のデータベースにアクセスできるユーザーがいる場合は、次のようにすることができます。

INSERT INTO destination_db.destintation_table 
    (col1, col2, col3, col4)
    SELECT col1, col2, col3, col4 FROM source_db.source_table
于 2012-11-20T08:00:29.490 に答える
0

この男は、データベースからテーブル名を取得し、それぞれに対してアクションを実行できる bash スクリプトを持っています: http://wozia.com/blog/tips/bash-script-to-repair-all-mysql-tables-for -すべてのデータベース/

それを上記の@Lexの回答と組み合わせると、探していることができるかもしれません。具体的には、リンクされたページでのみ 2 番目のファイルを使用し、mysqlの行を次のように変更します。

INSERT INTO targetdb.$TABLENAME (col1, col2, col3 col4)
    VALUES (SELECT col1, col2, col3, col4
            FROM sourcedb.$TABLENAME)

正しい列を参照するようにするには、少し作業する必要があると確信しています。また、重複チェックやエラー チェックを行わないと行き詰まる可能性がありますが、既に検討済みであると思います。

于 2012-11-20T13:08:38.140 に答える