如何使用 slick / plainSQL 检索自动递增的 ID?
-
21-12-2019 - |
题
是否没有一个 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