如何使用slick / plainSQL检索自动递增的ID?

时间:2014-02-25 11:38:34

标签: sql scala jdbc playframework slick

是否有一个灵巧的/ plainSQL本机解决方案来检索当前INSERT的自动递增ID?

userId是mySQL表中的自动增量字段。

sql"""
   INSERT INTO `table`(`email`) 
   OUTPUT INSERTED.userId 
   VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption

非常感谢帮助。

干杯 奥利弗

2 个答案:

答案 0 :(得分:3)

取决于数据库。

对于MS SQL,它是SCOPE_IDENTITY(),对于mySQL,它是LAST_INSERT_ID()。 如果不是上述内容,请尝试搜索数据库的等效内容。

由cvogt 添加:

目前没有针对普通SQL的灵活内置功能,并且在使用Slick的sql"..."插值或StaticQuery时无法访问基础jdbc语句,这将允许您访问{ {1}}。您可以修补SQL interpolatorStatementInvoker以允许此操作。他们只有150 LOC。也许值得一试并提交公关。

然而,您可以使用getGeneratedKeys之类的withPreparedInsertStatement方法之一,它使用Slick session方法来处理jdbc语句。我创建了一个PR来添加有关此内容的文档:jdbc connection

答案 1 :(得分:1)

感谢您cvogt帮助完成此讨论。 我认为提交PR是有帮助的,因为它是一个非常常见且有用的功能,slick's plainSQL queries中不应该遗漏。

最后,我找到了一个解决方法来替换丢失的原生函数,如下所示。

在同一个会话中,我解决了两个问题。第一个是INSERT语句,第二个语句是SELECT LAST_INSERT_ID(),它返回最近执行的AUTO_INCREMENTINSERT列设置的最新自动生成的值(1 )。更多详情:MySQL Reference - LAST_INSERT_ID()

Database.forDataSource(dataSource).withDynSession {
  sqlu"""INSERT INTO `users`(`email`) VALUES ("theEmailAdress@test.de")
  """.firstOption match {
    case Some(num) if num == 1 => sql"SELECT LAST_INSERT_ID()".as[Long].firstOption()
    case None => None
  }
}

这对我现在很有用。如果有任何改进,请不要犹豫,发布您的解决方案。