【问题标题】:transactions and conditional update in Jooq with scala使用 scala 在 Jooq 中进行交易和条件更新
【发布时间】:2016-09-11 06:39:54
【问题描述】:

我正在尝试运行此更新查询:

val updatedRows: Int = jooqDSL.dsl update ACCOUNT set(
          ACCOUNT.LOGIN_MEANS, loginMeans.loginType.toString) set(
          ACCOUNT.LOGIN_DATA, loginMeans.loginData) where (
          ACCOUNT.ID equal accountId) execute()

但如果我还没有具有不同 ACCOUNT.ID 但具有相同登录数据和方法的记录,它必须更新 。我本可以在此之前进行搜索以尝试找到这些记录(如果存在)。问题是我需要这个查询是一个单一的事务。 所以我考虑在查询中添加一个条件——只有在没有找到具有相同方法/数据字段的任何其他记录时,查询才会运行,但我找不到任何关于如何使用 DSL 进行操作的帮助和斯卡拉。 谢谢

【问题讨论】:

    标签: postgresql scala transactions jooq


    【解决方案1】:

    用约束解决这个问题。

    这通常会在数据库中使用UNIQUE 约束来解决:

    ALTER TABLE account 
      ADD CONSTRAINT acco_uk_means_data UNIQUE (login_means, login_data)
    

    如果更新会产生一个现有的(login_means, login_data) 组合,上面的语句将抛出一个违反约束的异常。

    用一个查询解决这个问题

    如果约束不是一个选项,那么只需添加一个NOT EXISTS 谓词:

    val updatedRows: Int = jooqDSL.dsl
       .update(ACCOUNT)
       .set(ACCOUNT.LOGIN_MEANS, loginMeans.loginType.toString)
       .set(ACCOUNT.LOGIN_DATA, loginMeans.loginData)
       .where(ACCOUNT.ID equal accountId)
       .andNotExists(
            selectOne()
           .from(ACCOUNT)
           .where(ACCOUNT.LOGIN_MEANS.equal(loginMeans.loginType.toString))
           .and(ACCOUNT.LOGIN_DATA.equal(loginMeans.loginData))
        )
       .execute()
    

    不过,您可能仍会在这两列上添加索引:

    CREATE INDEX acco_i_means_data ON (login_means, login_data)
    

    【讨论】:

    • 谢谢卢卡斯!没有考虑约束解决方案。很不错
    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 2013-12-01
    • 2019-02-14
    • 2011-04-07
    • 1970-01-01
    • 2021-12-27
    • 2021-11-23
    相关资源
    最近更新 更多