如何将数据从一个数据库导入到另一个数据库
本文关键字:数据库 一个 导入 另一个 数据 | 更新日期: 2023-09-27 18:26:48
我有一个在C#中运行的SQL语句,它从MySQL中数据库a中的表中获取数据,并将其插入数据B的表中。
我在一个SQL语句中执行选择和插入操作,因为数据太多,无法保存在内存中。我的问题是,如何指定目标数据库(数据库B)的连接字符串。
我的SQL语句是这样的:
sql = INSERT INTO Database_B.Table (SELECT * FROM Database_B.Table);
现在,我只指定数据库A的连接字符串:
sourceDatabaseConnectionString = "Server=localhost;Port=3306;Database=Database_A;Uid=root;Pwd=root;";
using (MySqlConnection connection = new MySqlConnection(sourceDatabaseConnectionString))
{
connection.Open();
using (MySqlCommand command = new MySqlCommand(sql, connection))
{
command.CommandTimeout = 0;
command.ExecuteNonQuery();
}
}
现在的问题是,这是完美的工作。但这两个数据库都在同一台服务器上,并且具有相同的凭据。如果数据库放在其他地方,我该如何处理?
我引用Mahmoud Gamal的帖子,他在另一篇帖子中提出了这个答案:
使用SELECT。。。进入。。。具有完全限定的表名database.schema.object_name,如下所示:
USE DatabaseName;
SELECT * FROM DatabaseName.schemaname.Tablename INSERT INTO
AnotherDatabase.schemaname.AnotherTablename;
然后,您可以使用ADO.net或其他API从C#执行此查询。
来源:在C#中将SQL查询的结果从一个数据库插入到另一个数据库
我已经通过使用OUTFILE语法解决了这个问题。这是我唯一能想到的在不使用链接服务器的情况下解决这个问题的方法,这对我的情况来说是不现实的,因为我不能访问数据库,只能接受用户的连接字符串。
我的解决方案首先执行SELECT语句并将数据写入文件。接下来,我的INSERT语句从文件中提取,并插入到另一个表中。
因此,这种方法避免了在内存中放入数百万条记录,并且由于它们是两个独立的语句,我能够将每个语句与不同的连接字符串绑定——因此问题得到了解决:)
代码类似于此:
statement1 = SELECT myFields INTO OUTFILE @file;
statement2 = LOAD DATA LOCAL INFILE @file INTO TABLE myTable;