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

使用JAVA将多行插入数据库表,java,postgresql,jdbc,random,insert,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,S

我需要在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();
Random rand=new Random();
对于(int j=0;j<1;j++);
stmt=c.createStatement();
String sql=“插入公司(ID、姓名、年龄、地址、工资)”
+“值(“+rand.nextInt()+”,“+rand.nextInt()+”,“+rand.nextInt()+”,“+rand.nextInt()+”,“+rand.nextInt()+”,”+
“““+rand.nextInt()+”)”;
stmt.executeUpdate(sql);
stmt.close();
c、 提交();
c、 close();

基本上,您有两种选择来实现这一点

让数据库完成所有工作 正如@a_horse_和_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
列(假设它是
主键)
(即:唯一且不为空)不应被分配一个随机值,该值可以重复

让程序计算所有值,但只生成一条语句: 如果出于某种原因,PostgreSQL的随机性对于您的应用程序来说不够好,或者您希望通过程序控制(伪)随机值的生成方式,那么您可以利用这样一个事实,即您可以在
值中声明多行

也就是说,以下语句是有效的:

INSERT INTO some_table(a_column) VALUES (101), (102), (103), (104) ;
并将在某个表中插入四行

您可以通过以下方式更改程序以生成值:

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();
Random rand=new Random();
StringBuilder sql=
新StringBuilder(“插入公司(ID、姓名、年龄、地址、工资)值;”;
对于(int j=0;j<1000000;j++)
{
如果(j)sql.append(“,”)
sql.append(“+j.toString()+/*ID不应是随机的()*/
“,”“+rand.nextInt().toString()+”“+/*名称*/
“,”+rand.nextInt().toString()+”“+/*年龄*/
“,”“+rand.nextInt().toString()+”“+/*地址*/
“,”“+rand.nextInt().toString()+”“+/*薪水*/
")") ;
}
stmt=c.createStatement();
stmt.executeUpdate(sql.toString());
stmt.close();
c、 提交();
c、 close();
注1:以这种方式生成的SQL语句并不“危险”,因为您完全控制了用于生成它的数据。如果您要使用用户输入,或某些来源或格式不可信的信息,请使用
准备好的语句
,以避免风险

注2:使用一个(不是字符串)来生成如此大的字符串


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

首先,我建议您开始使用,我还建议您查看并阅读有关批量更新的部分。要回答您的问题,请将
1
更改为类似
someOtherValue
的内容,其中
someOtherValue
是您要插入的行数。您只需一次插入即可完成此操作,无需循环:
插入公司(ID、姓名、年龄、地址、薪水)选择i,random()*10000+1,random()*80+1,random()*10000+1,random()*100+1 from generate_series(11000000)i
在@MadProgrammer所说的顶部,删除
for
语句末尾的分号,并在要重复的代码周围加上一些括号(
{
}
)。抱歉,sql语句太长,DB无法处理它(您将得到一个SQL异常)即使它到达了数据库。所以,它应该是一个没有名字的马建议的批更新。我使用SQL语句插入了几十万行,使用了
psql
pgAdmin
。数据库没有问题。我猜这是否可行取决于JDBC驱动程序的限制。如果它可以无法处理如此大的语句,您总是可以进行双循环:1000 x 1000可能适合任何驱动程序。问题不是插入的行数,而是发送到DB的sql语句的长度(sql insert语句太长)。我很确定上述解决方案不会起作用。而且,即使DB没有问题,将其发送到DB服务器进行处理需要多长时间。在您给出的示例中,StringBuilder需要方法调用,但我找不到问题。有什么建议吗?我想我在声明中犯了一个错误…应该是St造假者。