¿Cómo recuperar la ID incrementada automáticamente usando slick/plainSQL?
-
21-12-2019 - |
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
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