java - 使用JAVA向数据库表中插入多行

标签 java postgresql jdbc random insert

我需要将包含随机数的多行(大约 100 万行)插入到 Postgresql 数据库中。此代码在数据库中生成一行随机数。我怎样才能使语句本身循环任意次数?

        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();

最佳答案

你基本上有两种选择来做到这一点

让数据库完成所有工作

按照@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 语句并不“危险”,因为您可以完全控制用于生成它的数据。如果您要使用用户输入或某些来源或格式不可信的信息,请使用 PREPARED STATEMENTS,以避免 SQL injection 的风险.

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

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

关于java - 使用JAVA向数据库表中插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42752982/

相关文章:

java - 企业级应用程序中的事务

java - 用 Java 显示 GUI 组件

postgresql - FireDAC:如何避免 "Cannot describe type"错误? (在 postgres 几何列上)

sql - 根据连接表的另一列对一列进行双重计数

sql - 是否有实现不可知的方式让 SQL DB 提供 UUID?

java - ORA-01461/BLOB/hibernate

java - spring jdbc 和复合主键

java - 显示图像

java - 在循环中创建 JButton 会导致仅出现最后一个

java - 我们如何区分图像滤镜效果?