在 MySQL 8 中,在插入值以在
ON DUPLICATE KEY UPDATE
语句中引用它时可以指定行别名,如下所示:
INSERT INTO foo (id, col1, col2)
VALUES(123, 'foo', 'bar'), (321, 'bar', 'baz') as new_row
ON DUPLICATE KEY UPDATE col1 = new_row.col1, col2 = new_row.col2
这将替换旧的
VALUES()
功能,请参阅 https://dev.mysql.com/worklog/task/?id=13325
不幸的是,我无法在 jOOQ 中编写此查询,因为
InsertValuesStep
不允许我指定别名。是否有其他可能添加此别名,例如使用普通 SQL DSL?
jOOQ 不通过 API 支持这种特定的 MySQL 特定语法,但您可以使用 PostgreSQL 特定的
EXCLUDED
伪表 来实现此目的。此用法也应记录在手册中,请参阅#15999。因此,假设您至少使用 jOOQ 3.17,请编写:
ctx.insertInto(FOO)
.columns(FOO.ID, FOO.COL1, FOO.COL2)
.values(123, "foo", "bar")
.values(321, "bar", "baz")
.onDuplicateKeyUpdate()
.set(FOO.COL1, excluded(FOO.COL1))
.set(FOO.COL2, excluded(FOO.COL2))
.execute();
使用这种方法,您无法为您的
VALUES()
子句指定一个明确的名称,但这实际上并不是必需的。