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

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

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

帮助将不胜感激。

欢呼奥利弗

有帮助吗?

解决方案 2

谢谢 cvogt 用于帮助在本次讨论中。 我认为提交PR是有助于提出的,因为它是一个非常常见的和有用的功能,在 slick的plainsql查询

最后,我找到了一个工作来替换丢失的本机函数如下。

在同一会话中我解决了两个查询。第一个是INSERT语句,第二个语句是生成的,它是由最近被执行的世纪DodeTagcode(1)为SELECT LAST_INSERT_ID()列设置的最新的自动生成的值。这里有更多详细信息: mysql引用 - 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
  }
}
.

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

其他提示

取决于数据库。

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

添加者:cvogt:

目前没有针对普通 SQL 的 slick 内置功能,并且在使用 Slick 时无法访问底层 jdbc 语句 sql"..." 插值或 StaticQuery, ,这将允许您访问 getGeneratedKeys. 。你也许可以修补 SQL 插值器语句调用者 允许这样做。他们只有 150 LOC。也许值得一试并提交 PR。

但是,您可以使用其中之一 流畅的会话 方法就像 withPreparedInsertStatement, ,其中包裹 jdbc连接 使用 jdbc 语句的方法。我创建了一个 PR 来添加有关此内容的文档: https://github.com/slick/slick/pull/691

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top