Slick 3 正在为单个列 table 生成不正确的 MySQL upsert 语句
Slick 3 is generating incorrect MySQL upsert statements for a single column table
我有一个非常简单的 MySQL table,它使用单个字符串列表示一组名称。我想使用 Slick 的 insertOrUpdate
,但它生成的 MySQL 不正确,导致错误。具体来说就是要执行
insert into `TABLE1_NAME` (`column`) values ('value') on duplicate key update
它没有指定更新什么,所以失败了。具有两列的类似 table 可以很好地插入,并带有
之类的语句
insert into `TABLE2_NAME` (`key`, `other_col`) values ('value1', 'value2') on duplicate key update `other_col`=VALUES(`other_col`)
有人看过吗?我们确实为 TABLE1
设置了一个主键。我们可能 table 投影映射不正确。我们正在使用 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)
}
单列table中没有"insert or update"这样的概念。单列是键的一部分。如果键完全匹配,则没有其他列要更新。如果键不匹配,那么新插入的行将不会与任何键重复,因此不会发生更新子句。因为没有其他要更新的列,所以生成的 SQL 格式不正确——生成了一些文本,假设一些字段名将附加在它后面,但没有要附加的字段名。
顺便说一下,对于有两列的 table,插入语句看起来像
insert into `TABLE2_NAME` (`key`, `other_col`)
values ('value1', 'value2')
on duplicate key update `other_col`=VALUES(`other_col`)
它仅列出 update
子句中的非键列。 (正确理解这一点应该可以帮助您更好地理解您的单列 table。)
我有一个非常简单的 MySQL table,它使用单个字符串列表示一组名称。我想使用 Slick 的 insertOrUpdate
,但它生成的 MySQL 不正确,导致错误。具体来说就是要执行
insert into `TABLE1_NAME` (`column`) values ('value') on duplicate key update
它没有指定更新什么,所以失败了。具有两列的类似 table 可以很好地插入,并带有
之类的语句insert into `TABLE2_NAME` (`key`, `other_col`) values ('value1', 'value2') on duplicate key update `other_col`=VALUES(`other_col`)
有人看过吗?我们确实为 TABLE1
设置了一个主键。我们可能 table 投影映射不正确。我们正在使用 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)
}
单列table中没有"insert or update"这样的概念。单列是键的一部分。如果键完全匹配,则没有其他列要更新。如果键不匹配,那么新插入的行将不会与任何键重复,因此不会发生更新子句。因为没有其他要更新的列,所以生成的 SQL 格式不正确——生成了一些文本,假设一些字段名将附加在它后面,但没有要附加的字段名。
顺便说一下,对于有两列的 table,插入语句看起来像
insert into `TABLE2_NAME` (`key`, `other_col`)
values ('value1', 'value2')
on duplicate key update `other_col`=VALUES(`other_col`)
它仅列出 update
子句中的非键列。 (正确理解这一点应该可以帮助您更好地理解您的单列 table。)