所以我最近开始阅读有关 sql 最佳实践的文章,并发现了使用批处理语句进行插入和更新的知识。所以想用我学到的新知识更新一些代码。例如我有一个这样的循环: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。任何想法如何解决我的问题?我想在我的插入查询中进行子选择,但我担心这会削弱性能。
1 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
序列是生成唯一数字的最安全和最快的方式(PostgreSQL 的“自动增量”类型serial或identity在后台使用它)。
要使用它,请先创建一个:
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()
}
添加回答
举报
0/150
提交
取消