有没有办法知道MERGE中执行了什么操作?

问题描述 投票:0回答:1

使用jOOQ和PostgreSQL,有没有办法知道MERGE、INSERT或UPDATE执行了什么操作?

例如使用 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();

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

注意:不是这个问题的重复。那是 SQL Server 特定的。我的是 PostgreSQL 和 jOOQ 特定的。

java sql postgresql jooq
1个回答
0
投票

PostgreSQL

MERGE
无法对其底层
RETURNING
INSERT
语句使用
UPDATE
子句,因此您只留下受影响的行总数,而没有任何指示它们如何影响受到影响。 文档:

成功完成后,

MERGE
命令会返回以下形式的命令标签

MERGE total_count

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

RETURNING
不存在
MERGE
子句。
INSERT
UPDATE
DELETE
的操作不能包含
RETURNING
WITH
子句。

您可以使用旧的 upsert 语法

INSERT...ON CONFLICT DO UPDATE
,它能够使用
RETURNING
子句,并在其中检查受影响行的
xmax
系统列
:插入的行将始终为零,更新后的值将不为零。 示例

jOOQ 同时提供

.onConflict()
.returningResult()
(仅 3.11 之前的
.returning()
)。有问题的部分似乎是隐藏系统列的暴露,您可能无法立即引用。如果情况仍然如此,您将需要一个plain SQL
field
(可在此处找到)。

© www.soinside.com 2019 - 2024. All rights reserved.