是否有一个灵巧的/ plainSQL本机解决方案来检索当前INSERT的自动递增ID?
userId是mySQL表中的自动增量字段。
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
非常感谢帮助。
干杯 奥利弗
答案 0 :(得分:3)
取决于数据库。
对于MS SQL,它是SCOPE_IDENTITY(),对于mySQL,它是LAST_INSERT_ID()。 如果不是上述内容,请尝试搜索数据库的等效内容。
由cvogt 添加:
目前没有针对普通SQL的灵活内置功能,并且在使用Slick的sql"..."
插值或StaticQuery
时无法访问基础jdbc语句,这将允许您访问{ {1}}。您可以修补SQL interpolator和StatementInvoker以允许此操作。他们只有150 LOC。也许值得一试并提交公关。
然而,您可以使用getGeneratedKeys
之类的withPreparedInsertStatement
方法之一,它使用Slick session方法来处理jdbc语句。我创建了一个PR来添加有关此内容的文档:jdbc connection
答案 1 :(得分:1)
感谢您cvogt帮助完成此讨论。 我认为提交PR是有帮助的,因为它是一个非常常见且有用的功能,slick's plainSQL queries中不应该遗漏。
最后,我找到了一个解决方法来替换丢失的原生函数,如下所示。
在同一个会话中,我解决了两个问题。第一个是INSERT
语句,第二个语句是SELECT LAST_INSERT_ID()
,它返回最近执行的AUTO_INCREMENT
为INSERT
列设置的最新自动生成的值(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
}
}
这对我现在很有用。如果有任何改进,请不要犹豫,发布您的解决方案。