Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Slick 3.0 Insert and then get Auto Increment Value

I have written this code which works perfectly

class Items(tag: Tag) extends Table[Item](tag, "ITEMS") {   def id = column[Long]("ITEMS_ID", O.PrimaryKey, O.AutoInc)   def name = column[String]("ITEMS_NAME")   def price = column[Double]("ITEMS_PRICE")   def * = (id, name, price) <> ((Item.apply _).tupled, Item.unapply _) }  object Shop extends Shop{   val items = TableQuery[Items]   val db = Database.forConfig("h2mem1")    def create(name: String, price: Double) : Int = {     val action = items ++= Seq(Item(0, name, price))     val future1 = db.run(action)     val future2 = future1 map {result =>        result map {x => x}     }     Await.result(future2, Duration.Inf).getOrElse(0)   } } 

This code works but the return value is number of records inserted. But I want to return the value of the AutoInc after the insert has been done.

i did google and found few articles

Slick 3.0.0 AutoIncrement Composite Key

Returning the auto incrementing value after an insert using slick

But somehow these do not answer the question cleanly.

like image 448
Knows Not Much Avatar asked Jul 16 '15 00:07

Knows Not Much


People also ask

How can I get auto-increment value after insert?

To obtain the value immediately after an INSERT , use a SELECT query with the LAST_INSERT_ID() function. For example, using Connector/ODBC you would execute two separate statements, the INSERT statement and the SELECT query to obtain the auto-increment value.

Why does auto-increment jumps by more than the number of rows inserted?

It could have multiple causes: Check if the auto_increment value on the table itself, has the next highest value. Mind that if you have transactions where you INSERT a row and rollback the transaction, that auto_increment value will be gone/skipped.

Can we insert auto-increment value in MySQL?

Syntax for MySQLMySQL uses the AUTO_INCREMENT keyword to perform an auto-increment feature. By default, the starting value for AUTO_INCREMENT is 1, and it will increment by 1 for each new record. VALUES ('Lars','Monsen'); The SQL statement above would insert a new record into the "Persons" table.

How does SQL auto-increment work?

Auto-increment allows a unique number to be generated automatically when a new record is inserted into a table. Often this is the primary key field that we would like to be created automatically every time a new record is inserted.


2 Answers

Here's the relevant documentation page, according to which, you should construct a query like this:

val insertQuery = items returning items.map(_.id) into ((item, id) => item.copy(id = id))  def create(name: String, price: Double) : Future[Item] = {   val action = insertQuery += Item(0, name, price)      db.run(action) } 
like image 151
dcastro Avatar answered Sep 18 '22 13:09

dcastro


Try this one instead:

def create(name: String, price: Double): Future[Int] = db.run {     (items returning items.map(_.id)) += Item(0, name, price) } 
like image 23
aleck Avatar answered Sep 18 '22 13:09

aleck