【问题标题】:How to copy table from one database to another?如何将表从一个数据库复制到另一个?
【发布时间】:2014-05-02 17:07:14
【问题描述】:

我需要从一个数据库中取出一张表并将其上传到另一个数据库。 所以,我创建了两个单独的连接。这是我的代码

Connection connection1 = // set up connection to dbms1
Statement statement = connection1.createStatement();
ResultSet result = statement.executeQuery("select * from ............. "); 

Connection connection2 =  // set up connection to dbms2
// Now I want to upload the ResultSet result into the second database
Statement statement2 = connection2.createStatement("insert into table2 " + result);
statement2.executeUpdate();

上面的最后几行不起作用 我怎样才能做到这一点 ?底线是如何重用现成的结果集

ResultSet 是一个现成的 java 对象。我希望有办法将它添加到批处理或类似的东西和 executeUpdate但不要将结果集写入一些临时空间(Listcsv 等)和插入

【问题讨论】:

  • "insert into table2 " + result" 我不认为你可以这样做,从你的结果集中提取每一行数据并构造一个适当的sql插入语句。
  • 我知道我可以将这些数据写入 csv 文件,然后逐行插入。但这需要很多时间。我希望有更好的方法。 ResultSet 是一个 java 对象。一定有办法不让它崩溃。 .一定有办法重用它
  • 这可能会有所帮助:stackoverflow.com/questions/11268057/…
  • 这不是关于获取元数据。我可以手动创建一个包含所有元数据的空 table2。我的观点是我怎样才能有效地重用结果集
  • 我认为没有提取 ResultSet 并且没有构建适当的 SQL statemnts 没有其他方法。 E

标签: java resultset


【解决方案1】:

最简单的方法是使用prepared statement 插入。它允许您创建一个语句对象,该对象可用于使用不同的参数值多次运行查询。

try (final Statement statement1 = connection1.createStatement();
     final PreparedStatement insertStatement = 
     connection2.prepareStatement("insert into table2 values(?, ?)"))
{
    try (final ResultSet resultSet =
         statement1.executeQuery("select foo, bar from table1"))
    {
        while (resultSet.next())
        {
            // Get the values from the table1 record
            final String foo = resultSet.getString("foo");
            final int bar = resultSet.getInt("bar");

            // Insert a row with these values into table2
            insertStatement.clearParameters();
            insertStatement.setString(1, foo);
            insertStatement.setInt(2, bar);
            insertStatement.executeUpdate();
        }
    }
}

当您遍历来自table1 的结果时,这些行被插入到table2,因此无需存储整个结果集。

您还可以使用准备好的语句的addBatch()executeBatch() 方法将所有插入排队并将它们一次全部发送到数据库,而不是为每个单独的插入行发送单独的消息到数据库。但这迫使 JDBC 将所有待处理的插入保存在本地内存中,这似乎是您试图避免的。因此,在这种情况下,一次插入一行是您最好的选择。

【讨论】:

  • 为什么我们必须在 Java 中这样做?我们可以使用 DB Links 并在数据库本身中进行操作。
  • 因为有时数据库所有者不想将它们链接在一起。在我们的例子中,这通常是出于安全原因。
【解决方案2】:

如果您不想手动列出数据库中每个表的所有字段名称,您应该可以改为执行以下两步过程:

  1. 使用this question 中的答案复制表架构。
  2. 使用resultSet.getMetaData() 获取字段列表,并使用它来驱动@Wyzard 答案中SELECT/INSERT 代码的修改版本。

如果我得到它的工作,我会在这里发布代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多