为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中进行不自动增量的批量插入

在 Java 中进行不自动增量的批量插入

HUH函数 2021-09-12 20:31:33
所以我最近开始阅读有关 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()

}


查看完整回答
反对 回复 2021-09-12
  • 1 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信