[SQL/Oracle] Insert in 2 Tabellen, Fremdschluessel

Hallo!

Folgendes Szenario:
Table1:
table1_id (pk)
blib
bluh

Table2:
table2_id (pk)
table1_id (fk)
blob
blah

Problem:
Ich lege nun fuer Table1 einen Datensatz an und moechte
sofort im Anschluss in Table2 ebenfalls einen Datensatz
anlegen mit der table1_id des kurz vorher angelegten
Datensatzes in Table1.

insert into table1 (table1\_id, blib) 
 values (MySequence.NextVal, 'test')

insert into table2 (table2\_id, table1\_id, blob) 
 values (MySequence.NextVal, ???, 'test')

Frage:
Wie bekomme ich die table1_id?
(Die id’s werden automatisch von einer Sequence geholt.)
Soll ich bevor ich den Datensatz in Table2 anlege ein
„select max(table1_id) from table1“ machen oder gibt
es eine bessere Loesung?

Vielen Dank und Gruss
Patrick

insert into table1 (table1_id, blib)
values (MySequence.NextVal, ‚test‘)

insert into table2 (table2_id, table1_id, blob)
values (MySequence.NextVal, ???, ‚test‘)

Frage:
Wie bekomme ich die table1_id?
(Die id’s werden automatisch von einer Sequence geholt.)
Soll ich bevor ich den Datensatz in Table2 anlege ein
„select max(table1_id) from table1“ machen oder gibt
es eine bessere Loesung?

Hallo Patrick!

Die gibt es! Es gibt für sequences neben nextval auch noch die pseudocolumn currval, die den zuletzt von der Sequence geholten Wert zurückgibt, ohne die Sequence zu erhöhen. WICHTIG: Die Sequence muß in der aktuellen Session zumindest einmal mit nextval initialisiert werden, bevor currval verwendet werden kann. In Deinem Beispiel wäre also „currval - 1“ einzusetzen. ACHTUNG! Das geht natürlich nur, wenn die beiden INSERTs wirklich nur einen Satz einfügen!

Ich hoffe das hilft, Gruß

TheBeast

Excellent!
Vielen Dank.

Gruss
Patrick

hi!

wobei ich eigentlich noch immer die „sichere“ variante mittels pl/sql bevorzuge und die sequence in eine variable lege … außer es muß schnell gehen und es ist nur ein satz einzufügen, dann hol ich mir vorher die sequence mittels select from dual und füg sie dann hardcodiert ein … currval hat so seine „schwächen“, sprich: multi-user-betrieb …

grüße,
tomh

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

… currval hat so seine
„schwächen“, sprich: multi-user-betrieb …

grüße,
tomh

Hi Tomh!

Frage: Wo siehst Du Schwächen im Zusammenhang mit currval und multi-user Betrieb? Den Wert der Sequence, den ich mir vorher mit nextval geholt habe bleibt innerhalb einer Session immer gleich, bis ich mir den nächsten Wert mit nextval geholt habe, unabhängig davon, was andere User / Sessions in der Zwischenzeit machen, und genau das erwarte ich mir doch.

Gruß,
TheBeast

hi thebeast!

ips, ich sollte lieber mein gehirn aktivieren, bevor ich currval mit select last_number from user_sequences vergleiche … genau da hatte ich meine probleme - keine ahnung, wie ich da plötzlich auf currval komme … grmpf … hab’s jetzt extra im multi-user-betrieb ausprobiert und currval funktioniert wirklich einwandfrei … sorrry für den schnellschuß …

grüße,
tomh

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]