189

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

我知道我可以使用

INSERT INTO database2.table2 SELECT * from database1.table1

但这里的问题是两者database1database2在不同的 MySQL 用户下。所以user1只能访问database1user2只能访问database2。任何想法?

4

19 回答 19

134

如果您有 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 已经存在,您可以将参数添加到第一个不允许创建 table-creates 的 mysqldump。

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
于 2012-09-03T06:51:33.117 回答
128

CREATE TABLE db1.table1 SELECT * FROM db2.table1

其中 db1 是目标,db2 是源

于 2014-03-24T19:30:46.437 回答
72

如果您使用的是PHPMyAdmin,它可能非常简单。假设您有以下数据库:

DB1 & DB2

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

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

在此页面上,单击右上角的“操作”选项卡。在 Operations 下,查找Copy table to (database.table) 部分:

&你完成了!

于 2015-08-13T11:51:57.590 回答
29

MySql Workbench:强烈推荐

MySql Workbench 中的数据库迁移工具

这将很容易处理迁移问题。您可以在 MySql 和 SqlServer 之间迁移选定数据库的选定表。你一定要试一试。

于 2012-09-03T07:48:27.297 回答
24

我使用 Navicat for MySQL...

它使所有数据库操作变得容易!

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

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1
于 2014-01-26T17:28:10.590 回答
15

它对我有用

CREATE TABLE dbto.table_name like dbfrom.table_name;
insert into  dbto.table_name select * from dbfrom.table_name;
于 2020-08-17T19:22:58.460 回答
13

如果您的表在同一个 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;
于 2017-03-07T18:10:39.980 回答
12

这是另一种简单的方法:

  1. 使用 DB1;显示创建表 TB1;
    • 在剪贴板中复制此处的语法以在 DB2 中创建 TB1
  2. 使用 DB2;
    • 在此处粘贴语法以创建表 TB1

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

于 2017-10-26T00:11:03.177 回答
12

我知道这是个老问题,只是回答,以便任何来到这里的人都能得到更好的方法。

从 5.6.10 开始,您可以执行

CREATE TABLE new_tbl LIKE orig_tbl;

请参阅此处的文档:https ://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

于 2017-12-20T09:05:09.387 回答
8

使用 MySql Workbench 的导出和导入功能。步骤:
1. 选择你想要的值

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

    E.g. create table table2 like table1; 
    
  3. 从新表中全选

    E.g. select * from table2;  
    
  4. 单击导入并选择您在步骤 2 中导出的 CSV 文件

MySql Workbench 中的导出和导入按钮示例

于 2015-04-01T15:59:06.860 回答
4

Try mysqldbcopy (documentation)

Or you can create a "federated table" on your target host. Federated tables allow you to see a table from a different database server as if it was a local one. (documentation)

After creating the federated table, you can copy data with the usual insert into TARGET select * from SOURCE

于 2012-09-03T08:18:32.340 回答
4

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

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

于 2015-01-16T16:24:49.833 回答
3

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

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 的答案相同,但该方法更安全,因为密码不会以原始文本形式暴露给控制台(反向搜索、密码嗅探器等)。如果它是从对其权限施加适当限制的脚本文件执行的,则其他方法很好。

于 2020-05-12T08:00:51.513 回答
3

获取所需的所有查询的一种简单方法是使用来自 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'您可以通过从初始查询中追加来避免它们:

于 2019-06-18T06:43:38.467 回答
2

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

您可以进行导出(例如使用 phpMyAdmin 或类似方法),将您的表格及其内容编写成文本文件,然后您可以将其重新导入其他数据库。

于 2012-09-03T06:09:07.990 回答
1

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

  1. CREATE TABLE 表名(列名数据类型(大小),列名数据类型(大小));

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

于 2015-08-13T07:24:59.817 回答
0

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

于 2017-03-04T14:38:43.613 回答
0

对我来说,我需要将特定模式指定为“information_schema.TABLES”

例如。

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM information_schema.TABLES  WHERE TABLE_SCHEMA = 'old_db';
于 2020-12-26T08:59:03.410 回答
-1

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

于 2020-02-19T16:35:51.907 回答