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

如何使用slick/PLANSQL检索自动递增的ID?,sql,scala,jdbc,playframework,slick,Sql,Scala,Jdbc,Playframework,Slick,难道没有一个slick/PLANSQL本机解决方案来检索当前插入的自动递增id吗 userId是mymysql表中的一个自动增量字段 sql""" INSERT INTO `table`(`email`) OUTPUT INSERTED.userId VALUES ("theEmailAdress@test.de") """.as[Int].firstOption 非常感谢您的帮助 干杯 奥利弗取决于数据库 对于MS SQL,它是SCOPE_IDENTITY(),对于my

难道没有一个slick/PLANSQL本机解决方案来检索当前插入的自动递增id吗

userId是mymysql表中的一个自动增量字段

sql"""
   INSERT INTO `table`(`email`) 
   OUTPUT INSERTED.userId 
   VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
非常感谢您的帮助

干杯
奥利弗取决于数据库

对于MS SQL,它是SCOPE_IDENTITY(),对于mySQL,它是最后一个插入ID()。 如果没有上述内容,请尝试搜索数据库的等效项

由cvogt添加

目前没有用于普通SQL的slick内置功能,并且在使用slick的
SQL“…”
插值或
StaticQuery
时,无法访问底层jdbc语句,这将允许您访问
getGeneratedKeys
。您可能会修补并允许这样做。它们只有150海里。也许值得一试并提交一份公关


但是,您可以使用类似于
的方法之一withPreparedInsertStatement
,该方法包装方法以使用jdbc语句。我创建了一个PR来添加关于此的文档:

取决于数据库

对于MS SQL,它是SCOPE_IDENTITY(),对于mySQL,它是最后一个插入ID()。 如果没有上述内容,请尝试搜索数据库的等效项

由cvogt添加

目前没有用于普通SQL的slick内置功能,并且在使用slick的
SQL“…”
插值或
StaticQuery
时,无法访问底层jdbc语句,这将允许您访问
getGeneratedKeys
。您可能会修补并允许这样做。它们只有150海里。也许值得一试并提交一份公关

但是,您可以使用类似于
的方法之一withPreparedInsertStatement
,该方法包装方法以使用jdbc语句。我创建了一个PR来添加关于此的文档:

感谢您在此讨论中提供的帮助。 我认为提交一份PR会很有帮助,因为它是一个非常常见和有用的功能,不应该在中丢失

最后,我找到了一个替代缺少的本机函数的方法,如下所示

在同一个会话中,我解决了两个问题。第一条是
INSERT
语句,第二条是
SELECT LAST\u INSERT\u ID()
,它返回最近执行的
INSERT
(1)为
自动增量列设置的最新自动生成值。详情如下:

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

感谢您在此讨论中提供的帮助。 我认为提交一份PR会很有帮助,因为它是一个非常常见和有用的功能,不应该在中丢失

最后,我找到了一个替代缺少的本机函数的方法,如下所示

在同一个会话中,我解决了两个问题。第一条是
INSERT
语句,第二条是
SELECT LAST\u INSERT\u ID()
,它返回最近执行的
INSERT
(1)为
自动增量列设置的最新自动生成值。详情如下:


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

感谢您的快速回复。但这并不是我想要的解决方案:插入
电子邮件
)值(“theEmailAdress@test.de"); 选择最后一个插入ID();船上没有光滑的本地工具吗?我不知道你说的是什么意思。好了,这是唯一常见的解决方案,我从来没有理由去搜索其他东西。我冒昧地直接添加到了答案中。谢谢你的快速回答。但这并不是我想要的解决方案:插入
电子邮件
)值(“theEmailAdress@test.de"); 选择最后一个插入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
  }
}