我有一个表,其中有[主键计数器]用于[另一个表中的每页注解]。
这些主键是每页的:* 对于每页 *,注解ID从1开始。
我想原子地分配10个ID来写10个新注解。
- 我可以用PostgreSQL和JDBC来实现吗?
(And您是否有任何示例/相关JDBC文档的链接?)
我只找到了returning
如何作为新插入行的主键的示例,使用了一些getGeneratedKeys
,这在我的情况下似乎没有用。
我认为SQL UPDATE语句看起来应该是这样的:
update PAGES
set NEXT_COMMENT_ID = NEXT_COMMENT_ID + 10
where PAGE_ID = ? <-- next-comment-id is *per page*
returning NEXT_COMMENT_ID into ?
因此,不同的线程和服务器不会尝试重用/覆盖相同的ID(对吗?)
5条答案
按热度按时间hrirmatl1#
无需对
Statement
对象使用execute()
和getResult()
方法即可支持此操作:如下所示(排除任何错误处理):
由于你知道这个语句的作用,这应该没问题。处理一个“未知”的SQL语句有点复杂,因为你需要在一个循环中调用
getMoreResults()
和getUpdateCount()
。有关细节,请参见Javadocs。2nbm6dog2#
所以你想要下面的结构?
x =页面主键y =注解主键
页表
备注表
最有意义的做法是在这里使用一个外键结构,并对子记录设置上限。
vlurs2pr3#
创建执行
update ... returning ... into
的存储函数:并这样称呼它:
相关文件:
pkwftd7m4#
若要使表包含逻辑顺序,则可能需要在子表中创建组合键和外键。
这能让你达到你的目的吗
kwvwclae5#
你正在做一个更新,但是语句会生成结果,所以使用
executeQuery()
而不是executeUpdate()
,这就是调用之间的真实的区别:executeQuery()
处理产生ResultSet
的语句;而executeUpdate()
返回受影响的行数的计数。