我需要将包含随机数的多行(大约 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/