2016-09-30 2 views
1

Ich arbeite mit Postgres-Datenbank und Java. Ich benutze Jooq, um meine Datenbank abzufragen. Ich muss eine Einfügung in meiner Tabelle vornehmen und die von dieser Einfügung generierte Primärschlüssel/Sequenz erhalten. Ich weiß, in einfachen Postgres ich es wie folgt tun:Verwendung von Postgres currval() in jooq

Dies ist, was meine Tabelle wie folgt aussieht:

CREATE TABLE "myTable" (

    "id" SERIAL NOT NULL, 
    "some_text" TEXT NOT NULL, 
    PRIMARY KEY ("id") 
); 

Dies ist die Abfrage einfügen:

INSERT INTO public.myTable(some_text) 

VALUES ('myValue'); 

und als die letzte zu bekommen Sequenz,

SELECT currval('myTableName_myColumnName_seq') 

FROM myTable; 

1) Wie kann ich currval in JOOQ verwenden? Im Moment bin ich versucht, so etwas wie dieses:

config.dsl().insertInto(Tables.myTable) 
       .set(Tables.myTable.myText, inputText) 
       .execute(); 

config.dsl().select.currval('myTableName_myColumnName_seq') 
       .from myTable; 

aber off-Kurs die letzte Anweisung gibt Fehler.

Antwort

2

Das Problem mit Ihrer Lösung besteht darin, dass während Sie einen Datensatz in Ihre Tabelle einfügen, möglicherweise ein anderer Prozess Wert aus einer Sequenz erhält und Sie mit der zweiten Abfrage einen falschen Wert erhalten (SELECT currval).

PostgreSQL können Sie einige Daten zurück in INSERT Anweisung mit RETURNING Klausel erhalten:

INSERT INTO public.myTable(some_text) 
VALUES ('myValue') 
RETURNING id; 

Wie jOOQ Handbuch erklärt, sollten Sie returning und fetch in diesem Fall verwendet werden. Ich bin mir nicht sicher über die richtige Nutzung (ich bin nicht vertraut mit jOOQ), so etwas wie folgt vor:

config.dsl().insertInto(Tables.myTable) 
      .set(Tables.myTable.myText, inputText) 
      .returning(Tables.myTable.id) 
      .fetch(); 
2

Sie können den aktuellen Wert einer Sequenz durch Sequence.currval() erhalten, die zu diesem Zweck einen Ausdruck zurückgibt. Z.B.

dsl().select(MYTABLENAME_MYCOLUMNNAME_SEQ.currval()).from(...) 

Aber da dieser Sequenz wird automatisch generiert-aus einer SERIAL die Werte Folge automatisch auf Einfügungen erzeugt, ich mit icuken's answer völlig einverstanden sind, Sie INSERT .. RETURNING stattdessen verwenden sollten.

+0

Also verwende ich die obige Abfrage von icusen und speichern Sie das Ergebnis in einem Ergebnisobjekt. Obwohl ich nur einen Spaltennamen in der Funktion "Rückgabe" gebe, aber ich bekomme die ganze Tabelle mit den anderen Spalten Werte als Null markiert. Ich möchte jetzt nur die ID aus dieser Ergebnistabelle extrahieren. Wie kann ich das machen? Die ID ist vom Typ Integer in der von JOOQ generierten Klasse. Es ist ein serieller Primärschlüssel in der Datenbank. – user1858796

+0

@ user1858796: Verwenden Sie einfach 'result.getValue (Index, Spalte)'. Es gibt viele Möglichkeiten, das ist einer von ihnen. Hoffe das hilft. –