Pregunta

¿No existe una solución nativa de SQL simple/slick para recuperar la identificación incrementada automáticamente del INSERT actual?

userId es un campo incremental automático en mi tabla MySQL.

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

La ayuda sería muy apreciada.

Saludos Oliver

¿Fue útil?

Solución 2

Gracias cvogt por ayudar en esta discusión.Creo que sería útil enviar un PR, ya que es una funcionalidad muy común y útil que no debería faltar en consultas PlainSQL de Slick.

Finalmente, encontré una solución alternativa para reemplazar la función nativa faltante de la siguiente manera.

Dentro de una misma sesión resuelvo dos consultas.El primero es el INSERT declaración, la segunda declaración es SELECT LAST_INSERT_ID() que devuelve el valor generado automáticamente más reciente que se configuró para el AUTO_INCREMENT columna del recién ejecutado INSERT(1).Más detalles aquí: Referencia de 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
  }
}

Esto funciona para mí ahora mismo.Si hay alguna mejora, no dude en publicar su solución.

Otros consejos

Depende de la base de datos.

Para MS SQL es SCOPE_IDENTITY(), para mySQL es LAST_INSERT_ID().Intente buscar un equivalente para su base de datos si no es ninguno de los anteriores.

Añadido por cvogt:

Actualmente no existe ninguna característica integrada de Slick para SQL simple para esto y no hay forma de acceder a la declaración jdbc subyacente cuando se utiliza Slick. sql"..." interpolación o StaticQuery, que le permitiría acceder getGeneratedKeys.Probablemente puedas parchear el interpolador SQL y Invocador de declaración para permitir esto.Son sólo 150 LOC.Quizás valga la pena intentarlo y enviar un PR.

Sin embargo, podrías utilizar uno de los sesión hábil método como withPreparedInsertStatement, que envuelve conexión jdbc Métodos para trabajar con una declaración jdbc.Creé un PR para agregar documentación sobre esto: https://github.com/slick/slick/pull/691

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top