将表从一个数据库复制到另一个数据库的最简单方法?

当数据库属于不同的用户时,将数据从一个数据库中的表复制到另一个数据库中的表的最佳方法是什么?

我知道我可以用

INSERT INTO database2.table2 SELECT * from database1.table1

但这里的问题是database1database2都在不同的MySQL用户下。因此,user1只能访问database1,而user2只能访问database2。任何想法?

378757 次浏览

这是你需要定期做的事情,还是只做一次?

你可以做一个导出(例如使用phpMyAdmin或类似),将脚本出你的表和它的内容到一个文本文件,然后你可以重新导入到另一个数据库。

如果你有shell权限,你可以使用mysqldump来转储database1.table1的内容,并将其管道到mysqldatabase2。这里的问题是table1仍然是table1

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

也许你需要用另一个查询将table1重命名为table2。另一种方法是使用sed在to管道之间将table1更改为table2。

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

如果table2已经存在,你可以在第一个mysqldump中添加参数,它不允许创建table- created。

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

MySql Workbench .:强烈推荐

数据库迁移工具From MySql Workbench

这将很容易处理迁移问题。支持在MySql和SqlServer之间迁移指定数据库的指定表。你绝对应该试一试。

尝试mysqldbcopy (文档)

或者你可以在目标主机上创建一个"联合表"。联邦表允许您查看来自不同数据库服务器的表,就像它是本地表一样。(文档)

创建联邦表后,可以使用通常的insert into TARGET select * from SOURCE复制数据

我使用Navicat MySQL…

它使所有数据库操作变得简单!

您只需在Navicat中选择两个数据库,然后使用。

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

CREATE TABLE db1.table1 SELECT * FROM db2.table1

哪里db1是目标,db2是源

使用MySQL Workbench,您可以使用数据导出将表转储到本地SQL文件(仅数据,仅结构或结构和数据),然后使用数据导入将其加载到另一个DB中。

您可以同时打开多个连接(不同的主机、数据库、用户)。

使用MySql工作台的导出和导入功能。 步骤:< br > 1. 选择你想要的值

E.g. select * from table1;
  1. 单击Export按钮并将其保存为CSV。
  2. 创建一个新表,使用与第一个表相似的列

    E.g. create table table2 like table1;
    
  3. select all from the new table

    E.g. select * from table2;
    
  4. Click on Import and select the CSV file you exported in step 2

Sample of the Export and Import buttons in MySql Workbench

使用以下步骤将一些列从一个数据库表复制并插入到另一个数据库表

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

2.INSERT INTO db2。SELECT columnname1,columnname2 FROM db1.tablename

如果你使用< em > PHPMyAdmin, < / em >,它可以非常简单。 假设您有以下数据库:

DB1 & DB2

DB1有一个表用户,您希望将其复制到DB2

在PHPMyAdmin下,打开DB1,然后转到用户表。

在本页中,单击右上方的“操作”选项卡。 在操作下,查找将表复制到(database.table):

部分

,你完蛋了!

IN xampp只是将所需的表导出为.sql文件,然后将其导入到所需的表中

如果你的表在同一个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;

这里有另一个简单的方法:

    <李>使用DB1;创建表TB1
    • 复制剪贴板中的语法,在DB2中创建TB1
    • 李< / ul > < / > <李>使用DB2;
      • 将语法粘贴到这里以创建表TB1
      • 李< / ul > < / >

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

我知道这是一个老问题,只是回答,以便任何人降落在这里得到更好的方法。

从5.6.10开始你就可以做到

CREATE TABLE new_tbl LIKE orig_tbl;

在这里参考文档:https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

获得所需的所有查询的一种简单方法是使用来自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'来避免它们:

像sakila.customer一样创建表destination_customer(Database_name.tablename),这将只复制源表的结构,对于数据也要复制的结构做这个创建表destination_customer select * from sakila.customer .tablename

首先创建转储。如果table2已经存在,则添加--no-create-info --no-create-db标志:

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

然后输入user1密码。然后:

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

然后输入user2密码。

helmor的回答相同,但这种方法更安全,因为密码不会以原始文本的形式暴露在控制台(反向搜索,密码嗅探器等)。如果从脚本文件执行,并对其权限设置了适当的限制,则其他方法也可以。

这对我很有效

CREATE TABLE dbto.table_name like dbfrom.table_name;
insert into  dbto.table_name select * from dbfrom.table_name;

对于我来说,我需要指定模式到“information_schema. table”;

为例。

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