0

各テーブルに数百万行のテーブルが 5 つあります。

各テーブルの形式は同じです。つまり、電子メール、IP アドレス、場所です。1 つの電子メール アドレスは、5 つのテーブルのいずれか、または 5 つのテーブルすべてに存在できます。他に と という 2 つのテーブルがUser_ipありUser_locationます。

各メール アドレスの一意の IP アドレスを User_ip テーブルに保存し、各メール アドレスの個別の場所を user_location テーブルに保存したいと考えています。

現在、私はこの手順に従っていますが、これにはかなりの時間がかかります。他の解決策または方法はありますか???

Statement stmt = connection.createStatement();

        stmt.executeUpdate("insert into temp(email,ip,location) select email,ip,location from Apr_web group by email,ip");
        stmt.executeUpdate("insert into temp(email,ip,location) select email,ip,location from Apr_gov group by email,ip");
        stmt.executeUpdate("insert into temp(email,ip,location) select email,ip,location from Apr_mail group by email,ip");
        stmt.executeUpdate("insert into temp(email,ip,location) select email,ip,location from Apr_pop group by email,ip");
        stmt.executeUpdate("insert into temp(email,ip,location) select email,ip,location from Apr_imap group by email,ip");

stmt1 = connection.createStatement();
stmt1.executeQuery("select distinct email from temp");
        ResultSet rs = stmt1.getResultSet();
        while(rs.next()){    
 Statement stmt2 = connection.createStatement();
                stmt2.executeQuery("select distinct substring_index(ip,'.',2) from temp where email='"+email+"'");
                ResultSet rs2 = stmt2.getResultSet();
                while(rs2.next()`enter code here`){
                    ip=rs2.getString(1);

                    Statement stmt3 = connection.createStatement();
                    Statement stmt4 = connection.createStatement();
                    stmt3.executeQuery("select * from user_ip where uid='"+email+"' and ip='"+ip+"'");
                    ResultSet rs3 = stmt3.getResultSet();
                    if(rs3.next()){
                        System.out.println("THE ROW ALREADY EXISTS IN IP TABLE");
                    }
                    else{
                        stmt4.executeUpdate("insert into user_ip(uid,ip) values('"+email+"','"+ip+"')");
                        System.out.println("ROW INSERTED IN USER_IP");
                    }

                }

 Statement stmt5 = connection.createStatement();                    
                stmt5.executeQuery("select distinct location from temp where   email='"+email+"' and location !='no information found'");
                ResultSet rs4 = stmt5.getResultSet();
                while(rs4.next()){
                    location = rs4.getString(1);
                    //Statement stmt6 = connection.createStatement();
                    //Statement stmt7 = connection.createStatement();

                    pst1 = connection.prepareStatement("select * from user_location where uid=? and location=?");
                    pst1.setString(1, email);
                    pst1.setString(2, location);



                    ResultSet rs5 = pst1.executeQuery();
                    if(rs5.next()){
                        System.out.println("THE ROW ALREADY EXISTS IN USER_LOCATION");
                    }
                    else{
                        pst2 = connection.prepareStatement("insert into user_location(uid,location) values(?,?)");
                        pst2.setString(1,email);
                        pst2.setString(2,location);
                        pst2.executeUpdate();

                        System.out.println("ROW INSERTED IN USER_LOCATION");
                    }
                }
}
4

3 に答える 3

0

2 つの SQL ステートメントでこれを行うことはできませんか。次のようなもの:-

INSERT IGNORE INTO user_ip (uid,ip)
SELECT DISTINCT email,SUBSTRING_INDEX(ip,'.',2) FROM Apr_web
UNION
SELECT DISTINCT email,SUBSTRING_INDEX(ip,'.',2) FROM Apr_gov
UNION
SELECT DISTINCT email,SUBSTRING_INDEX(ip,'.',2) FROM Apr_mail
UNION
SELECT DISTINCT email,SUBSTRING_INDEX(ip,'.',2) FROM Apr_pop
UNION
SELECT DISTINCT email,SUBSTRING_INDEX(ip,'.',2) FROM Apr_imap


INSERT IGNORE INTO user_location(uid,location)
SELECT DISTINCT email,location FROM Apr_web
UNION
SELECT DISTINCT email,location FROM Apr_gov
UNION
SELECT DISTINCT email,location FROM Apr_mail 
UNION
SELECT DISTINCT email,location FROM Apr_pop
UNION
SELECT DISTINCT email,location FROM Apr_imap
于 2013-04-30T09:53:15.787 に答える
0

自動コミットをオフにしましたか?そうでない場合は、接続を作成するときに、次のコマンドを使用して自動コミットをオフにします。

SET autocommit=0;接続文字列の末尾に追加します

最後に、すべてのアイテムが追加されたら、次のコマンドを使用します。

COMMIT;

または、すべての変更を破棄しますか (エラーが発生した場合):

ROLLBACK;

これらのコマンドは、データをコミットまたはロールバックするためのクエリとして MySQL データベースに送信されます。これにより、多くのアイテムをテーブルにすばやく配置できるようになります。

詳細については、ドキュメントを確認してください

于 2013-04-30T09:44:36.230 に答える
0

次のような解決策はありますか

stmt.executeUpdate(
  "INSERT INTO user_ip(uid,ip) "+
  "SELECT DISTINCT email,ip FROM temp "+
  "   LEFT JOIN user_id ON "+
  "      (temp.email = user_ip.email AND temp.ip = user_ip.ip) "+
  "    WHERE user_ip.email IS NULL");

あなたのために働きますか?

説明: 一時テーブルには存在するがテーブル user_ip にはまだ存在しない (email、ip) の固有のペアを見つけて、それらを user_ip に追加します。

于 2013-04-30T09:54:36.353 に答える