【问题标题】:Slick 3 is generating incorrect MySQL upsert statements for a single column tableSlick 3 为单列表生成不正确的 MySQL upsert 语句
【发布时间】:2016-04-04 18:24:35
【问题描述】:

我有一个非常简单的 MySQL 表,它使用单个 String 列表示一组名称。我想使用 Slick 的 insertOrUpdate,但它生成的 MySQL 不正确,导致错误。具体来说,它想执行

insert into `TABLE1_NAME` (`column`)  values ('value') on duplicate key update

它没有指定要更新的什么,所以失败了。具有两列的类似表可以很好地插入,带有类似

的语句
insert into `TABLE2_NAME` (`key`, `other_col`)  values ('value1', 'value2') on duplicate key update `other_col`=VALUES(`other_col`)

有人看过吗?我们确实为TABLE1 设置了一个主键。我们的表格投影映射可能不正确。我们正在使用 Slick 3.1.1。

class Table1(tag: Tag) extends Table[Table1Record](tag, "TABLE1_NAME") {
  def value = column[String]("value", O.PrimaryKey, O.Length(254))
  def * = (value) <> (Table1Record, Table1Record.unapply)
}

class Table2(tag: Tag) extends Table[Table2Record](tag, "TABLE2_NAME") {
  def value1 = column[String]("value1", O.PrimaryKey, O.Length(254))
  def value2 = column[String]("value2", O.Length(254))
  def * = (value1, value2) <> (Table2Record.tupled, Table2Record.unapply)
}

【问题讨论】:

    标签: mysql slick


    【解决方案1】:

    在单列表中没有“插入或更新”这样的概念。单列是键的一部分。如果键完全匹配,则没有其他列要更新。如果键不匹配,则新插入的行不会与任何键重复,因此不会发生更新子句。因为没有要更新的其他列,所以生成的 SQL 格式不正确 - 生成了一些文本,假设某些字段名称将附加在它之后,但没有要附加的字段名称。

    顺便说一下,对于一个有两列的表,插入语句看起来像

    insert into `TABLE2_NAME` (`key`, `other_col`) 
    values ('value1', 'value2')
    on duplicate key update `other_col`=VALUES(`other_col`)
    

    它只列出update 子句中的非键列。 (正确理解这一点应该有助于您更好地了解单列表的情况。)

    【讨论】:

    • 我明白了。所以我真正想要的是:“如果不存在则插入”,如this question。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2013-08-05
    • 2015-07-27
    相关资源
    最近更新 更多