Inserts in 2 Tabellen 1:n

Status
Nicht offen für weitere Antworten.

heidiweber

Aktives Mitglied
Hallo,

derzeit erstelle ich mit Swing eine kleine Applikation, die über ein Formular Daten in eine Datenbank einträgt.
Die Eingaben auf dem Formular sollen in 2 Tabellen eingefügt werden.
Die beiden Tabellen haben eine 1:n Beziehung. Die Datenbank ist eine Oracle 11.

Wie man einen Insert macht, ist kein Problem. Nur wie man Daten in 2 Tabellen einfügt, überfordert mich.

Dies ist der beispielhafte Aufbau der beiden Tabellen:

Tabelle1:
ID (Autowert/Sequenz -> wird von Oracle automatisch vergeben)
Vorname
Nachname


Tabelle2:
IdRef (ID der Tabelle 1)
Menge
Artikel


Ich möchte jetzt einen Datensatz in Tabelle1 inserten und mehrere (vielleicht so ca. 50 Datensätze) in Tabelle 2 inserten.

1) Kann man dies mit einem Insert-Statement realisieren? Oder sollte man sowas nicht machen, falls dies überhaupt gehen sollte.

2) Mein Problem ist, dass ich ja in Tabelle 2 die ID der Tabelle2 als Fremdschlüssel benötige.
Deswegen würde ich das so machen:
Insert in Tabelle1
Select max(ID) from Tabelle1 --> somit habe ich gerade eben vergebene ID
Und jetzt alle Inserts in Tabelle2 -> Entweder über "Insert ALL" oder über eine Schleife.

Das Mini-Problem, das ich hier sehe, ist, das in dem Moment, wo ich den Select max(ID) mache, gerade eben ein anderer Insert in Tabelle1 gemacht wurde und ich somit die falsche ID erhalte. Auch wenn dies sehr unwahrscheinlich sein sollte - könnte aber passieren. Sollte man daher lieber die Tabelle sperren?

Oder wie macht man sowas?
Kann mir bitte jemand einen Tipp geben
Vielen Dank und einen schönen Feiertag
Grüße
Heidi
 

Sergeant_Pepper

Bekanntes Mitglied

heidiweber

Aktives Mitglied
2) ich würde eine Sequenz verwenden, um das Problem zu umgehen. Siehe www.psoug.org/reference/sequences.html

Genau das ist doch mein Problem. Ich nehme doch in Tabelle1 eine Sequenz und es könnte eben zu diesem Problem kommen:

Das Mini-Problem, das ich hier sehe, ist, das in dem Moment, wo ich den Select max(ID) mache, gerade eben ein anderer Insert in Tabelle1 gemacht wurde und ich somit die falsche ID erhalte. Auch wenn dies sehr unwahrscheinlich sein sollte - könnte aber passieren. Sollte man daher lieber die Tabelle sperren?

Deswegen meine Frage, wie ich das Problem lösen könnte?

Vielen Dank
Grüße
Heidi
 

Sergeant_Pepper

Bekanntes Mitglied
Die Antwort bleibt die gleiche: benutze eine Oracle-Sequenz (nicht etwas selbstgebautes).

Eine Oracle-Sequenz liefert exakt die Funktionalität, die du brauchst.

So wird eine Sequenz erzeugt (einmalig beim Anlegen der Datenbank):
Code:
create sequence id_kunde_seq increment by 1 start with 1
Den Startwert kannst du beliebig setzen.

So wird in einer Session der nächste freie Wert abgerufen:
Code:
id_kunde_seq.nextval

So wird in einer Session mit dem aktuellen Wert gearbeitet:
Code:
id_kunde_seq.currval

Wichtig: mehrere Aufrufe von id_kunde_seq.nextval liefern immer neue IDs. Du darfst also nextval nur aufrufen, wenn du tatsächlich eine neue (weitere) ID brauchst.

Wenn mehrere Sessions zeitgleich aktiv sind (das was du völlig zu recht befürchtest), bekommt jede Session durch nextval eine eindeutige ID. Genau das, was du willst.

Deine Inserts könnten so aussehen:
Code:
insert into tabelle1(id_kunde, vorname, nachname) values(id_kunde_seq.nextval, 'Billy', 'Joel') 
insert into tabelle2(id_kunde, menge, artikel)    values(id_kunde_seq.currval, 3, 'Klavier')
Beachte die Verwendung von nextval und currval.

Edit:
Zeile 2 wird bei dir wahrscheinlich n-mal mit anderen Werten für 'Menge' und 'Artikel' aufgerufen. Aber du musst bei jedem Aufruf 'id_kunde_seq.currval' verwenden.
Erst wenn du einen weiteren Kunden einträgst, benutzt du wieder 'id_kunde_seq.nextval'.

Ein ganz kleiner Nachteil: wenn mit nextval eine ID erzeugt wird, die dann - aus welchen Gründen auch immer - nicht verwendet wird, entstehen Lücken in der Abfolge der IDs. Aber das ist zweitrangig. Wichtig ist die Eindeutigkeit.

Wenn du keine Lücken willst, musst du dir die entsprechende Programmlogik selber ausdenken.
 

heidiweber

Aktives Mitglied
Hallo Sergeant Pepper,

genau dies habe ich auch nach mehrstündigem Testen gerade eben auch herausgefunden. Du bestätigst mir nur mein Tetsen:) Absolut spitze! Zerbeche mir schon seit Tagen den Kopf, wie ich das Problem lösen könnte - und jetzt macht das die Datenbank für mich. Oracle ist schon net schlecht:) Oder macht das (fast) jede Datenbank (DB2, MySQL, SQLServer....)?

Dies sollte man in die FAQ aufnehmen. Habe ich bisher noch nirgends gefunden. Sollte eigentlich DB Grundwissen sein...

Vielen Dank nochmals für die ausführliche Info.
Wünche dir noch ein schönes WE

Liebe Grüße
Heidi
 
M

maki

Gast
>> Oder macht das (fast) jede Datenbank (DB2, MySQL, SQLServer....)?

Die anderen DBs geneerien eine ID beim einfügen des Datensatzes welche man abfragen kann.

Die "Lösung" mit der höchsten ID wird leider so schnell nicht aussterben, da genug Anfänger sich nicht so viele Gedanken machen wie du.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
J Mehrere Inserts bei Fehlschlag abbrechen Datenbankprogrammierung 2
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
M SQL inserts bringen Router zum Absturz Datenbankprogrammierung 8
alexpetri Problem mit jdbc MS Access / nach 670 inserts ist schluss. Datenbankprogrammierung 4
M executeBatch() - Inserts trotz Fehler weitermachen Datenbankprogrammierung 5
rambozola große anzahl an inserts bei oracle db unperformant Datenbankprogrammierung 15
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
Ataria SQLite Werte aus zwei Tabellen zusammenführen Datenbankprogrammierung 8
I H2 - GUI Tool.... sehe aber keine Tabellen Datenbankprogrammierung 2
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Kirby.exe Tabellen Zeilen combinen und splitten Datenbankprogrammierung 3
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
M Sql Tabellen erstellen Datenbankprogrammierung 3
F Tabellen automatisch erstellen wenn sie nicht existieren Datenbankprogrammierung 6
C Mapping mit Annotations von 2 Tabellen Datenbankprogrammierung 22
W Problem mit Insert in zwei Tabellen Datenbankprogrammierung 8
L Join zweier Tabellen in SQL Datenbankprogrammierung 2
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
feinperligekohlensaeure MySQL Dynamische Tabellen. Wie kann man es besser machen? Datenbankprogrammierung 3
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
D Count(*) auf 2 Tabellen anwenden Datenbankprogrammierung 7
D MySQL Many to Many Tabellen in Java abbilden? Datenbankprogrammierung 4
V SQLite 2 Tabellen vergleichen und nur Unterschiedliche Sätze rausgeben. Datenbankprogrammierung 31
F Tabellen verbinden Datenbankprogrammierung 13
L0MiN Wie kann ich eine bestimmte Seite aus verschiedenen Excel-Tabellen in eine neue Exceldatei kopieren? Datenbankprogrammierung 1
U Kann die Tabellen nicht finden Datenbankprogrammierung 0
D umschalten zwischen verschiedene Tabellen Datenbankprogrammierung 1
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
J MySQL Workbench Tabellen werden verschoben Datenbankprogrammierung 1
M MySQL Tabellen dynamisch erstellen Datenbankprogrammierung 12
T Ähnliche Wrapperklassen + DB-Tabellen Datenbankprogrammierung 1
K HSQLDB Einzelne Tabellen abfragen? Datenbankprogrammierung 4
T Tabellen Alias Datenbankprogrammierung 7
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
J Tabellen in Tabellen finden Datenbankprogrammierung 4
S versionierte Tabellen Datenbankprogrammierung 2
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
I Was ist besser: Tabellen oder Spalten Datenbankprogrammierung 1
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Vergleich von Daten in verschiedenen Tabellen Datenbankprogrammierung 1
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
G 2 Tabellen und ein spezieller Eintrag Datenbankprogrammierung 2
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
T 2 Tabellen aus 2 Datenbanken miteinander vergleichen Datenbankprogrammierung 6
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
R PostgreSQL Tabellen hinzufügen, falls nicht vorhanden Datenbankprogrammierung 3
E Tabellen nacheinander auslesen Datenbankprogrammierung 10
D Übersichtliche Zuweisung von Daten in Tabellen Datenbankprogrammierung 17
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
A Zugriff auf DB-Tabellen mit Objekten Datenbankprogrammierung 3
K SQL tabellen auswahl in jfreechart Datenbankprogrammierung 2
0 Alle Tabellen aus DB lesen Datenbankprogrammierung 2
F Komplexer Tabellen-Join und Ausgabe in Excel Datenbankprogrammierung 17
I Master/Detail Tabellen mit JDBC und Swing Datenbankprogrammierung 10
H Fortlaufende Nummerierung innerhalb mehrerer Tabellen Datenbankprogrammierung 4
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
Consuelo Verbinden von zwei Tabellen, foreign key Datenbankprogrammierung 4
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
R MySQL Unbenutzte Tabellen/Spalten herausfinden Datenbankprogrammierung 7
I mit Java SQL Attribute / Tabellen erstellen Datenbankprogrammierung 17
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
F Einzelne Sql- Tabellen sichern (lokal) Datenbankprogrammierung 2
I MySQL - Anzahl Tabellen heraus finden Datenbankprogrammierung 6
B Es werden keine Tupel in Tabellen abgelegt Datenbankprogrammierung 2
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
S HSQLDB Kopiere Tabellen Datenbankprogrammierung 2
Guybrush Threepwood Nachträgliches Ändern von Variableneigenschaften in (gefüllten) Tabellen Datenbankprogrammierung 3
J Tabellen auflisten, die in einer Datenbank enthalten sind Datenbankprogrammierung 16
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
T SQL Abfrage: Zeige alle Values von bestimmten Tabellen Datenbankprogrammierung 11
R Datenbanken, Tabellen normalisieren. Datenbankprogrammierung 1
A Datenbankzugriffe, mehr Tabellen Datenbankprogrammierung 12
oliver1974 JPA, JTable und 2 DB-Tabellen... Datenbankprogrammierung 2
J Starre Datenbankstruktur oder Tabellen bei Bedarf neu erzeugen? Datenbankprogrammierung 5
X Abfrage über 2 Tabellen mit Tücken Datenbankprogrammierung 3
G verbindung 2er Tabellen Datenbankprogrammierung 3
M Auswerten über drei Tabellen Datenbankprogrammierung 2
G Mehrere Tabellen abfragen Datenbankprogrammierung 7
M JavaDB/Derby: Tabellen erstellen Datenbankprogrammierung 8
G 2 Tabellen in einer 1:n Verbindung Datenbankprogrammierung 2
M insert in 2 tabellen Datenbankprogrammierung 7
MQue Metadaten für Tabellen in der Datenbank Datenbankprogrammierung 5
D aus mehreren sql tabellen matchen und sortieren Datenbankprogrammierung 6
G 2 Tabellen zusammenfügen wie? Datenbankprogrammierung 8

Ähnliche Java Themen


Oben