Frage

Gibt es keine native Slick / plainSQL-Lösung, um die automatisch inkrementierte ID der aktuellen EINFÜGUNG abzurufen?

Benutzer-ID ist ein automatisch inkrementelles Feld in meiner MySQL-Tabelle.

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

Hilfe wäre sehr dankbar.

Jubel Oliver

War es hilfreich?

Lösung 2

Danke cvogt um in dieser Diskussion zu helfen.Ich denke, es wäre hilfreich, eine PR einzureichen, da es sich um eine sehr häufige und nützliche Funktionalität handelt, die in nicht fehlen sollte slicks plainSQL-Abfragen.

Schließlich habe ich eine Problemumgehung gefunden, um die fehlende native Funktion wie folgt zu ersetzen.

Innerhalb derselben Sitzung erledige ich zwei Anfragen.Der erste ist der INSERT aussage, die zweite Aussage ist SELECT LAST_INSERT_ID() das gibt den neuesten automatisch generierten Wert zurück, der für das festgelegt wurde AUTO_INCREMENT kolumne des kürzlich Hingerichteten INSERT(1).Mehr Details hier: MySQL-Referenz - 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
  }
}

Das funktioniert gerade für mich.Wenn es Verbesserungen gibt, zögern Sie nicht, Ihre Lösung zu posten.

Andere Tipps

Hängt von der Datenbank ab.

Für MS SQL ist es SCOPE_IDENTITY(), für MySQL ist es LAST_INSERT_ID() .Versuchen Sie, nach einem Äquivalent für Ihre Datenbank zu suchen, wenn es keines der oben genannten ist.

Hinzugefügt von cvogt:

Hierfür gibt es derzeit keine in Slick integrierte Funktion für einfaches SQL und keine Möglichkeit, auf die zugrunde liegende JDBC-Anweisung zuzugreifen, wenn Slicks verwendet werden sql"..." interpolation oder StaticQuery, was Ihnen erlauben würde, darauf zuzugreifen getGeneratedKeys.Sie könnten wahrscheinlich das patchen SQL-Interpolator und StatementInvoker um dies zu ermöglichen.Sie sind nur 150 LOC.Vielleicht lohnt es sich, eine Chance zu geben und eine PR einzureichen.

Sie könnten jedoch einen der folgenden verwenden Glatte Sitzung methode wie withPreparedInsertStatement, die wickeln jdbc-Verbindung methoden zum Arbeiten mit einer JDBC-Anweisung.Ich habe eine PR erstellt, um eine Dokumentation dazu hinzuzufügen: https://github.com/slick/slick/pull/691

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top