Tabelle mit Sequenzen

Hallo zusammen,

wie komme ich im bei einem INSERT auf eine Tabelle bei der die PID via Sequenze automatisch generiert wird, an den PID Wert der bei diesem INSERT generiert wurde.
Der Wert wird zum Verknüpfen (SID) aus einer anderen Tabelle benötigt.
Das ganze sollte auch in einer Mehrbenutzerumgebung sicher sein!

z. B. so etwas halte ich für zu unsicher
Insert Into TabelleA …
SELECT max(id) FROM TabelleA

Wenn da ein anderer Anwender dazwischen (was sich ja nicht ausschließen lässt) auch einen Insert absetzt, bekomme ich die falsche ID.

select currval();

oder

select currval('seq_name');

Details unter: https://www.postgresql.org/docs/current/static/functions-sequence.html

Hallo castorp,

habe ich das richtig verstanden:
Benutzer A
INSERT selbeTabelle
SELECT currval(‘STseqence’) -> z. B. 1365

Benutzer B
INSERT selbeTabelle
SELECT currval(‘STseqence’) -> z. B. 1366

Benutzer A
SELECT currval(‘STseqence’) -> z. B. 1365
INSERT selbeTabelle
SELECT currval(‘STseqence’) -> z. B. 1367

Benutzer B
SELECT currval(‘STseqence’) -> z. B. 1366

Vielen Dank

Wenn die Frage darauf abzielt, ob das sicher ist in einer Umgebung mit konkurrierenden Verbindungen/Transaktionen, dann ist die Antwort: Ja.

Du kannst übrigens auch mit RETURNING arbeiten:

test=*# create table heidilx(id serial primary key, val text);
CREATE TABLE
test=*# insert into heidilx (val) values ('test 1') returning id;
 id 
----
  1
(1 Zeile)

INSERT 0 1
test=*# insert into heidilx (val) values ('noch ein test') returning id;
 id 
----
  2
(1 Zeile)

INSERT 0 1
test=*#

Du bekommst also bei dem Insert ein Ergebniss - und dieses ist die vergebene ID.

Hallo,

danke für die Antworten.
@castorp: ja, genau das war gemeint
@akretschmer: da muss ich schauen wie die Antwort in LibreOffice ankommt.
Wieder was gelernt.

Thema gelöst. – Danke :slight_smile: