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