如何从一个表中检索一百万行并将其插入到另一个表中? [复制]

Posted

技术标签:

【中文标题】如何从一个表中检索一百万行并将其插入到另一个表中? [复制]【英文标题】:How to retrieve a million rows from a table and insert it into another table? [duplicate] 【发布时间】:2019-01-26 19:57:33 【问题描述】:

我有一个返回一百万行的 sql 连接查询。

那个 SQL QUERY 是:

 SELECT d.* 
 FROM snomed_conceptdata c, snomed_descriptiondata d 
 WHERE c.active = 1 and conceptid = c.id AND d.active = 1

我如何检索这些数据并将其插入另一个表而不会遇到内存堆空间不足错误。我目前正在使用 mysql 数据库。

我当前的代码:

package Snomed.Snomed;

import java.sql.PreparedStatement;
import java.sql.ResultSet;


import catalog.Root;

public class Snomedinfo 

    public void snomedinfoinsert()
    
    Root oRoot = null;
    ResultSet oRsSelect = null;
    PreparedStatement oPrStmt = null;
    PreparedStatement oPrStmt2 = null;
    PreparedStatement oPrStmtSelect = null;
    String strSql = null;


    ResultSet oRs = null;
    String refid = null;
    String id = null;
    String effectivetime = null;
    String active = null;
    String moduleid = null;
    String conceptid = null;
    String languagecode = null;
    String typeid = null;
    String term = null;
    String caseSignificanceid = null;

    try
    oRoot = Root.createDbConnection(null);
    strSql = "SELECT d.* FROM snomed_conceptdata c, snomed_descriptiondata d WHERE c.active = 1 and conceptid = c.id AND d.active = 1  "; //this query returns a million rows.


    oPrStmt2 = oRoot.con.prepareStatement(strSql);

    oRs = oPrStmt2.executeQuery();

    String sql = "INSERT INTO snomedinfo_date (refid,id,effectivetime,active,moduleid,conceptid,languagecode,typeid,term,caseSignificanceid) VALUES( ?, ?, ?,?,?,?,?,?,?,?)";
    oPrStmt = oRoot.con.prepareStatement(sql);





        while (oRs.next())
        
            refid = Root.TrimString(oRs.getString("refid")); 
            id = Root.TrimString(oRs.getString("id"));
            effectivetime = Root.TrimString(oRs.getString("effectivetime"));
            active = Root.TrimString(oRs.getString("active"));
            moduleid = Root.TrimString(oRs.getString("moduleid"));
            conceptid = Root.TrimString(oRs.getString("conceptid"));
            languagecode = Root.TrimString(oRs.getString("languagecode"));
            typeid = Root.TrimString(oRs.getString("typeid"));
            term = Root.TrimString(oRs.getString("term"));
            caseSignificanceid = Root.TrimString(oRs.getString("caseSignificanceid"));  


            oPrStmt.setString(1, refid);
            oPrStmt.setString(2, id);
            oPrStmt.setString(3, effectivetime);
            oPrStmt.setString(4, active);
            oPrStmt.setString(5, moduleid);
            oPrStmt.setString(6, conceptid);
            oPrStmt.setString(7, languagecode);
            oPrStmt.setString(8, typeid );
            oPrStmt.setString(9, term);
            oPrStmt.setString(10, caseSignificanceid);
             oPrStmt.executeUpdate();
        






    

    catch (Exception e) 
        e.printStackTrace();

    

    finally 

        oRsSelect = Root.EcwCloseResultSet(oRsSelect);
        oRs = Root.EcwCloseResultSet(oRs);
        oPrStmt = Root.EcwClosePreparedStatement(oPrStmt);
        oPrStmt = Root.EcwClosePreparedStatement(oPrStmt2);
        oPrStmt = Root.EcwClosePreparedStatement(oPrStmtSelect);
        oRoot = Root.closeDbConnection(null, oRoot);
    



    public static void main(String args[] ) throws Exception 
       

      Snomedinfo a = new Snomedinfo();
      a .snomedinfoinsert();

      



【问题讨论】:

我可能会首先尝试在数据库上做所有事情,如果这不起作用,我会尝试使用 offset 和 limit 来批量加载。可能还有某种可滚动的结果,可以在您遍历它时获取行 - 我现在不能看,所以我会把它留给你 :) 好的,但是我如何检索如此庞大的数据??我尝试使用限制和偏移量,但随着限制的增加,数据检索过程变得非常慢(需要永远) 这是一种 ORM 解决方案可能会变得性能不佳的情况。在同一个数据库中,使用答案。如果由于某种原因无法做到这一点,请使用 JDBC。 ResultSet 不会将整个数据集读入内存,所以可以读写。插入操作也可以在块中完成。 请不要创建重复的帐户,您已经在另一个帐户下反复问过这个问题。你为什么坚持一遍又一遍地问同一个问题? 【参考方案1】:

在mysql中你可以使用创建选择或者如果表已经存在插入选择

create my_table_copy
SELECT d.* 
FROM snomed_conceptdata c
INNER JOIN snomed_descriptiondata d ON c.active = 1 
          and conceptid = c.id 
              AND d.active = 1

insert into   your_table  (col1, col2, col3)
SELECT d.col1, d.col2, d.col3 
FROM snomed_conceptdata c
INNER JOIN snomed_descriptiondata d ON c.active = 1 
          and conceptid = c.id 
              AND d.active = 1.51

确保您有足够的磁盘空间

【讨论】:

@Andreas .. 谢谢 .. 更新的建议答案 ..

以上是关于如何从一个表中检索一百万行并将其插入到另一个表中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?

在 Oracle 中插入一百万行的最快方法

如何使用 for 循环选择字段值并将它们插入到另一个表中

php检索插入的最后一条记录的ID并将其插入另一个表中

如何使用'$row'将一个数据库表中的特定值插入到另一个数据库表中?