使用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 特定的。
MERGE
无法对其底层 RETURNING
和 INSERT
语句使用 UPDATE
子句,因此您只留下受影响的行总数,而没有任何指示它们如何影响受到影响。 文档:
成功完成后,
命令会返回以下形式的命令标签MERGE
MERGE total_count
是更改的总行数(无论是插入、更新还是删除)。total_count
不存在RETURNING
子句。MERGE
、INSERT
和UPDATE
的操作不能包含DELETE
或RETURNING
子句。WITH
INSERT...ON CONFLICT DO UPDATE
,它能够使用 RETURNING
子句,并在其中检查受影响行的 xmax
系统列:插入的行将始终为零,更新后的值将不为零。 示例。
.onConflict()
和 .returningResult()
(仅 3.11 之前的 .returning()
)。有问题的部分似乎是隐藏系统列的暴露,您可能无法立即引用。如果情况仍然如此,您将需要一个plain SQL field
(可在此处找到)。