【问题标题】:How to retrieve the auto incremented ID using slick / plainSQL?如何使用 slick/plainSQL 检索自动递增的 ID?
【发布时间】:2014-02-25 11:38:33
【问题描述】:

难道没有 slick/plainSQL 原生解决方案来检索当前 INSERT 的自动递增 id 吗?

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

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

我们将不胜感激。

干杯 奥利弗

【问题讨论】:

标签: sql scala jdbc playframework slick


【解决方案1】:

取决于数据库。

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

由 cvogt 添加

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

但是,您可以使用 withPreparedInsertStatement 之类的 Slick session 方法之一,它包装了 jdbc connection 方法以使用 jdbc 语句。我创建了一个 PR 来添加有关此的文档:https://github.com/slick/slick/pull/691

【讨论】:

  • 感谢您的快速回答。但这不是我正在寻找的解决方案: INSERT INTO table(email) VALUES ("theEmailAdress@test.de");选择 LAST_INSERT_ID();没有漂亮的板载原生工具吗?
  • 我不知道你的意思是什么。 AFAIK 这是唯一常见的解决方案,我从来没有理由去寻找其他东西。
  • 我冒昧地直接添加到答案中。
【解决方案2】:

感谢 cvogt 在本次讨论中提供帮助。 我认为提交 PR 会有所帮助,因为它是一个非常常见且有用的功能,slick's plainSQL queries 中不应缺少它。

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

在同一个会话中,我解决了两个问题。第一个是INSERT 语句,第二个语句是SELECT LAST_INSERT_ID(),它返回最近执行的INSERT(1) 为AUTO_INCREMENT 列设置的最新自动生成值。更多细节在这里: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
  }
}

这对我现在有效。如果有任何改进,请随时发布您的解决方案。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多