因此,我最近开始阅读有关sql最佳实践的文章,并发现了有关使用Batch Statements进行插入和更新的信息。因此想使用我的新知识来更新一些代码。例如,我有一个像这样的循环:

conn.setAutoCommit(false)

try {
    stmt = conn.prepareStatement("insert into TEST (ID,STR_TEST1) values (?,?)")

    for (String element : someList) {
        stmt.setInt(1, ???)
        stmt.setString(2, element)
    }
    stmt.executeBatch();
    conn.commit()
} finally {
    stmt.close()
}


现在很不幸,我的表不能自动增加ID,由于某些原因,我不能更改它,这意味着我必须始终选择表中的下一个“免费” ID。问题是,它不起作用,我猜是因为自动提交设置为false。有什么想法可以解决我的问题吗?我曾考虑过在插入查询中进行子选择,但是我担心这样做会降低性能。

最佳答案

序列是生成唯一数字的最安全,最快的方法(PostgreSQL的“自动增量”类型serialidentity在后台使用该序列)。

要使用它,create one first

create sequence test_id_seq;


如果目标表中已经有行,请调整顺序以返回大于当前最大值的值:

select setval('test_id_seq', (select max(id) from test));


然后在INSERT语句中使用nextval('test_id_seq')而不是提供值:

try {
    stmt = conn.prepareStatement(
      "insert into TEST (ID,STR_TEST1) values (setval('test_id_seq'),?)")

    for (String element : someList) {
        stmt.setString(1, element)
    }
    stmt.executeBatch();
    conn.commit()
} finally {
    stmt.close()
}

关于java - 在Java中进行批量插入而无需自动递增,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52274409/

10-12 00:24
查看更多