使用jOOQ和PostgreSQL,有没有办法知道对合并、插入或更新执行了什么操作?

例如,使用jOOQ文档中的示例:

create.mergeInto(AUTHOR)
      .using(create.selectOne())
      // Suppose the last name is unique (natural key) in my case
      .on(AUTHOR.LAST_NAME.eq("Hitchcock"))
      .whenMatchedThenUpdate()
      .set(AUTHOR.FIRST_NAME, "John")
      .whenNotMatchedThenInsert(AUTHOR.LAST_NAME)
      .values("Hitchcock")
      .execute();

理想情况下,如果可能的话,我将同时获得结果行和执行的操作.

Note:不是this question的复制品.这是SQL Server特有的.我的是PostgreSQL和jOOQ特定的.

推荐答案

PostgreSQL MERGE不能使用RETURNING子句作为其底层的INSERTUPDATE语句,所以你只剩下受影响的行数,而没有任何关于它们是如何受到影响的指示.Doc:

成功完成后,MERGE命令将返回以下形式的命令标记

MERGE total_count

total_count是更改的总行数(无论是插入、更新还是删除).

MERGE没有RETURNING条款.INSERTUPDATEDELETE的操作不能包含RETURNINGWITH子句.

您可以使用较旧的upsert语法INSERT...ON CONFLICT DO UPDATE,它能够使用RETURNING子句,并在其中判断xmax system column受影响的行:插入的行将始终为零,更新的行将具有非零.Example.

JOOQ提供.onConflict().returningResult()(只有.returning() before 3.11).有问题的部分似乎是隐藏的系统列的曝光,您可能无法立即引用.如果情况仍然如此,你将需要plain SQL field分(找到here分).

如果要达到xmax太麻烦,并且您不介意乱放模式,可以设置a reflector column,而不是try 使用隐藏的xmax.或者,如果您确定您的插入批处理从未包含冲突解决值,则计算最终使用它们的冲突解决值.

Java相关问答推荐

如何让TaskView总是添加特定的列来进行排序?

如何在Docker容器中使用wireock—Webhooks阻止请求?

当一个链表中间有一个循环时,它的松散部分会发生什么?

如何在Android上获取来电信息

Jooq外键关系

无法在WebSocket onMessage中捕获错误

RichFaces 3.x-Spring Boot-迁移web.xml

为什么在maven中,getLast方法不适用于List?

将响应转换为带值的键

无法在Java中处理PayPal支付响应

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

我怎样才能让IntelliJ标记toString()的任何实现?

Java中不兼容的泛型类型

一对多关系和ID生成

Java在操作多个属性和锁定锁对象时使用同步和易失性

每次我需要时创建和关闭数据库连接会有什么效果吗?

如何在SWT菜单项文本中保留@字符

为什么项目名称出现在我的GET请求中?

为什么我的登录终结点不能被任何请求访问?

为什么 Random() 的行为不符合预期?