导出数据库中所有表的某些列

时间:2012-11-18 06:45:21

标签: php mysql phpmyadmin

我有点问题。我有两个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列。

7 个答案:

答案 0 :(得分: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_%';

应该给你代码运行假设你的表都有一个前缀?在它返回后运行它返回的查询

答案 1 :(得分: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等。

答案 2 :(得分:0)

如果您的用户可以访问这两个数据库,则可以执行以下操作:

INSERT INTO destination_db.destintation_table 
    (col1, col2, col3, col4)
    SELECT col1, col2, col3, col4 FROM source_db.source_table

答案 3 :(得分:0)

这里的人有一个bash脚本,可以从数据库中获取表名并对每个表执行操作:http://wozia.com/blog/tips/bash-script-to-repair-all-mysql-tables-for-all-databases/

如果你将它与上面@ Lex的答案结合起来,它可能会做你想要的。具体来说,仅在链接页面上使用第二个文件,并将 mysql 行更改为:

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

我敢肯定你必须稍微努力才能引用正确的列。你也没有重复或错误检查,但我认为你已经考虑过了。

答案 4 :(得分: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)删除您不想从转储中复制的所有表格。将转储应用于目标数据库。

答案 5 :(得分:0)

我使用“Navicat for MySQL”来复制数据库之间的各种数据。听起来它可能适用于您的用例。 Navicat在跨数据库数据管理方面非常灵活。您可以下载30天的试用版,试用它并确定它是否适合您。 http://www.navicat.com

注意:我不为Navicat工作......我只是一个满意的客户。

答案 6 :(得分:0)

这是我的解决方案 - 需要在sudoers中配置PHP

<?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