在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 specific EXCLUDED pseudo table来实现.This usage is now documented in the manual as well,请参见#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()条款一个明确的名称,但无论如何这并不是真正必要的.

Mysql相关问答推荐

一次又一次地删除事件行

MySQL INSERT INSERT ON DIPLICATE KEY UPDATE WITH COMPAY PRIMARY KEY失败

使用由其中一个表的列规定的条件连接两个表

MySQL将JSON值从对象类型更改为数组

docker-compose:无法将应用程序服务连接到 mysql 数据库,收到错误:用户‘root’@‘localhost’访问被拒绝(使用密码:YES)

为什么用PyMySQL构建的json返回结果会出现重复?

有没有比使用 MySQL 计划事件更好的方法来更新我的数据库表中的列?

如何在 MySQL 中使用从 SELECT IF 返回的布尔值

如何在更新表单中使用 group by?在 SQL 中

MySql,如何从列中替换某种格式的字符串

MYSQL 或 Laravel Eloquent 如何从这个订单中统计细节

如何在 Mysql 中创建复合外键

sql sum - 处理连接表中的脏重复项

如何在 MySQL 中 Select 字段具有最小值的数据?

Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL?

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

我可以在 PHP 中使用 PDO 创建数据库吗?

如何将数组存储到mysql中?

在osx的命令行中使用Mysql-找不到命令?

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?