簡體   English   中英

使用in子句批量更新

[英]Batch update with in clause

是否有可能針對sqlite db以可變長度的條款執行批量更新?

val data = Seq(
  Seq(Set(1,2,3), 50),
  Seq(Set(4,5,6,7), 51)
)

NamedDB(symbol).localTx { implicit s: DBSession =>
  sql"""
    update table_a
    set xs=(
      select group_concat(x) from (
        select distinct x from table_b where id in (?)
      )
    ) where id=?
  """.batch(xs.map(_.data): _*).apply()
}

此默認方法導致scalikejdbc記錄該參數已設置為對象(警告?),結果是未應用任何更新。

我嘗試使用參數綁定器,但由於sqlite(及其JDBC驅動程序)不支持數組,因此無法將in (?)參數設置為數組類型。

另一種方法是將SQL文本更改為? 子句中的每個值。 對於批量更新,這是不可能的,因為不同的行具有不同數量的值。

我的解決方法是按in子句參數的數量對數據進行分組,並對每個子句執行單獨的批處理更新。

xs.map(_.data).groupBy(_.size - 1).foreach { case (length, data) =>
  NamedDB(symbol).localTx { implicit s: DBSession =>
    val inClauseParams = ("?" * length).mkString(",")
    SQL(
      s"""
       update table_a set xs=(
         select group_concat(x) from (
           select distinct x from table_b where id in ($inClauseParams)
         )
       ) where id=?
     """
    ).batch(data: _*).apply()
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM