使用JAVA将多行插入数据库表

时间:2017-03-12 20:50:23

标签: java postgresql jdbc random insert

我需要在Postgresql数据库中插入包含随机数的多行(约1百万行)。此代码生成一行随机数到数据库中。如何使语句循环自身任何次数?

        Random rand = new Random();
        for (int j=0;j < 1;j++);

            stmt = c.createStatement();
            String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "
                    + "VALUES ('" + rand.nextInt() + "', '" + rand.nextInt() + "', '" + rand.nextInt() + "', '" + rand.nextInt() + "'," +
                    " '" + rand.nextInt() + "')";
            stmt.executeUpdate(sql);

        stmt.close();
        c.commit();
        c.close();

1 个答案:

答案 0 :(得分:1)

你基本上有两种选择

让数据库完成所有工作

正如@a_horse_with_no_name所建议:只使用一个INSERT,让数据库计算所有随机值:

INSERT INTO COMPANY 
  (ID
  ,NAME
  ,AGE
  ,ADDRESS
  ,SALARY) 
SELECT
   i
   ,random() * 10000 + 1
   ,random() * 80 + 1
   ,random() * 10000 + 1
   ,random() * 1000000 + 1 
FROM
  generate_series(1,1000000) i 

这是在使用PostgreSQL时用随机值(例如模拟数据)填充表的通常的方法。请注意一件事:ID列,假设它是PRIMARY KEY(即:UNIQUE和NOT NULL),永远不应该分配一个可以重复的随机值。

拥有程序计算的所有值,但只生成一个语句:

如果出于某种原因,PostgreSQL的随机性对你的应​​用程序来说不够好,或者你想通过你的程序控制如何生成(伪)随机值,你可以利用您可以在VALUES中说明多行。

即,以下声明有效:

INSERT INTO some_table(a_column) VALUES (101), (102), (103), (104) ;

并在some_table中插入四行。

您可以将程序更改为以这种方式生成值:

Random rand = new Random();
StringBuilder sql = 
       new StringBuilder("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES ;");

for (int j=0; j < 1000000; j++)
{
  if (j) sql.append (",")
  sql.append ("(" + j.toString() +                      /* ID should NOT be random() */
              ",'" + rand.nextInt().toString() + "'" +  /* NAME    */
              ",'" + rand.nextInt().toString() + "'" +  /* AGE     */
              ",'" + rand.nextInt().toString() + "'" +  /* ADDRESS */
              ",'" + rand.nextInt().toString() + "'" +  /* SALARY  */
              ")") ;
}

stmt = c.createStatement();
stmt.executeUpdate(sql.toString());
stmt.close();
c.commit();
c.close();

注1:以这种方式生成的SQL语句不是&#34;危险&#34;因为您完全控制用于生成它的数据。如果您要使用用户输入或某些无法信任其来源或格式的信息,请使用PREPARED STATEMENTS,以避免SQL injection的风险。

注2:使用StringBuilder(不是字符串)生成如此大的字符串。

注3:由于SQL字符串太大而无法由JDBC或数据库本身处理(如@dsp_user所指出的),因此可能需要限制循环内的迭代次数;并对其进行第二次循环(显然,在这种情况下,j变量的使用应该会改变。)