0

我有一个小问题。我有两个 MySQL 数据库,我想将所有表从一个移到另一个,除非我使用普通的 PHPMyAdmin 导出,因为我的 ID 列而出现错误。如何将整个数据库复制到另一个数据库中,除非在 PHPMyAdmin 中不复制该表?另外,我不能只是手动复制表,因为我有很多表。我知道这可能涉及遍历数据库中的所有表。任何人都知道这样做的方法(如果它使用 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每个条目的列。因此,例如,如果我只是手动添加一个条目,我会使用CREATE TABLE IF NOT EXISTS mytable ..., 然后INSERT INTO mytable (col1, col2, col3, col4) VALUES (value1, value2, value3, value4). 请注意,我没有插入该id列。

4

7 回答 7

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 回答
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 等数据库管理工具。

于 2012-11-27T00:48:52.320 回答
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 的答案结合起来,它可能会满足您的需求。具体来说,仅在链接页面上使用第二个文件,并将mysql行更改为:

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

我敢肯定,您必须做一些工作才能让它引用正确的列。您也将无法进行重复或错误检查,但我假设您已经考虑过这一点。

于 2012-11-20T13:08:38.140 回答
0

好的,这是疯狂的方法。

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) 现在删除 VALUES 之后的第一个值,它应该是每一行的 id。

:%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,你可以在 shell 中运行这个命令行

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 回答