因此,我最近开始阅读有关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的“自动增量”类型serial
或identity
在后台使用该序列)。
要使用它,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/