jOOQ - MySQL 多行插入...使用 VALUES() 函数进行重复键更新

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

jOOQ 是否支持在 INSERT...ON DUPLICATE KEY UPDATE 中使用 VALUES() 函数?

如果没有,有什么建议可以替代吗? (对于很多行)

参见:http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values

java mysql sql jooq
2个回答
4
投票

在 jOOQ 的 API 中使用 PostgreSQL 特定语法

jOOQ 在 API 中没有 MySQL 特定的

VALUES()
支持,但从 jOOQ 3.17 开始,您可以通过
DSL.excluded()
使用 PostgreSQL 特定的等效项。 这记录在此处

这样的声明:

insertInto(AUTHOR, AUTHOR.ID, AUTHOR.LAST_NAME)
   .values(3, "X")
   .onDuplicateKeyUpdate()
   .set(AUTHOR.LAST_NAME, excluded(AUTHOR.LAST_NAME))
   .execute();

将被翻译成这个 MySQL 等效语句:

INSERT INTO AUTHOR (ID, LAST_NAME)
VALUES (
  3, 
  'X'
)
AS t
ON DUPLICATE KEY UPDATE
  AUTHOR.LAST_NAME = t.LAST_NAME

或者在旧版本的 MySQL 上:

INSERT INTO AUTHOR (ID, LAST_NAME)
VALUES (
  3, 
  'X'
)
ON DUPLICATE KEY UPDATE
  AUTHOR.LAST_NAME = VALUES(LAST_NAME)

请注意,较新版本的 MySQL 已弃用

VALUES(column_name)
,因此不应再使用。

另请参阅此答案

历史性答案:

从 jOOQ 3.8 开始,没有此类支持,目前也没有计划添加支持。不过,您可以使用简单的 SQL 轻松实现这一点:

public static <T> Field<T> values(Field<T> field) {
    return DSL.field("values({0})", field.getDataType(), field);
}

有关 jOOQ 中“普通 SQL”的更多信息,请参阅: http://www.jooq.org/doc/latest/manual/sql-building/plain-sql


0
投票

2021年更新,您可以使用Jooq的InsertOnConflictWhereStep

这是一个示例(在 Kotlin 中):

fun saveOrUpdate(items: Iterable<SomeClass>) {
    dsl.insertInto(
        TABLE,
        TABLE.FIELD1,
        TABLE.FIELD2,
    ).apply {
        items.forEach { item ->
            values(
                item.field1,
                item.field2
            )
                .onConflict(
                    TABLE.FIELD1
                )
                .doUpdate()
                .set(TABLE.FIELD2, item.field2)
                .set(TABLE.UPDATED_AT, currentOffsetDateTime())
        }
    }
        .execute()
}
© www.soinside.com 2019 - 2024. All rights reserved.