我需要在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();
答案 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
变量的使用应该会改变。)