# SqliteStudio Fremdschlüssel



## vikil (13. Feb 2015)

Hallo zusammen,
habe wieder mal ein Problem.:shock:
Ich habe vor datensätze in SQLITE DB zu speicher.
Es funktioniet auch soweit.

habe mit SQLITESTUDIO mehrere TAbellen angelegt. Jede Tabelle hat eine Primär ID.
Diese einzelne Tabellen will ich in einer Hauptabelle zusammenfassen.->
Die Haupttabelle hat auch eine Primär ID und Fremdschlüssel(Primär ID von untertabellen) von den anderen Tabellen.

Mein Problem ist
wenn ich Datensätze in die Untertabelle ablege, müssen diese ja uch in Hauptabelle über Fremdschlüssel angelegt werden, oder? 
oder habe ich ein Denkfehler. Habe auch gelesen das SQLITE Fremdschlüssel nicht interstützt. Stimmt es?
Es werden bei mir aber Datensätze nur in der jeweiliger Tabelle abgelegt!

DANKE im Voraus


----------



## Joose (13. Feb 2015)

Nein hier hast du einen Denkfehler! Es wird nur das angelegt was du anlegen willst.
Wenn du allerdings in der "Hauptabelle" eine Datensatz anlegen willst geht das nur wenn die entsprechenden Datensätze in der "Untertabelle" vorhanden sind. 
Die "Untertabellen" kannst du aber mit soviel Daten füttern wie du willst.

SQLite unterstützt Fremdschlüssel sehr wohl, bitte bei sowas am Besten auch immer einen Link bzw. eine Anmerkung posten woher diese Annahmen kommen.


----------



## vikil (13. Feb 2015)

Hallo Joose,
danke erstmal für die schnelle Antwort.
Stehe irgendwie auf dem Schaluch!
Wenn ich die Datensätze in die Untertabelle abgelegt habe, wie kommen die Daten (Fremdschlüssel) in die Haupttabelle.
Damit ich weiss welche datensätze von unterschiedlichen Tabellen zusammen gehören?


----------



## Joose (13. Feb 2015)

Bitte nimm Abstand von der Bezeichnung Haupttabelle bzw. Unter-/Nebentabelle.
Es sind alles einfach Tabellen und da gibt es keine Hierarchie.

Du musst selber die Datensätze in die 2.Tabelle eintragen mit allen benötigten Fremdschlüsseln.
Die Datenbank kann sich ja nicht ausdenken welche weiteren Werte sie einträgt.

Beispiel: 
Es gibt 2 Tabellen.
Tabelle B speichert Adressen (ID, Straßenname, Hausnummer, Stock, PLZ, Ort, Land, ...)
Tabelle A speichert Personendaten (ID, Alter, Name, Geschlecht, Email, ...) und hat eine Spalte mit Fremdschlüsselbeziehung zur Tabelle B (Spalte ID)

Nur weil du jetzt in Tabelle B einen neuen Datensatz anlegst, kannst du nicht erwarten das die Datenbank in Tabelle A einen Datensatz angelegt dafür.
Woher soll die Datenbank wissen welche Person unter der von dir eingetragenen Adresse wohnt?

Du musst dann natürlich einen Datensatz in Tabelle A eintragen mit den entsprechenden Daten.


----------



## vikil (13. Feb 2015)

Um auf dein Beispiel zurückzukommen

1->Ja ich muss in Tabelle A und B Datensätze Eintragen. Das habe ich auch so verstanden

2-> Paralell dazu lege ich Tabelle C  Verwalten(ID_TabA, ID_Tab_B )an. Dadurch habe ich die Verbindung zu den Datensätzen zwischen beiden Tabellen A und B.
Frage ist nur wie kommt ID_TabA, ID_Tab_B in Tabelle C rein.

Habe es so verstanden, da es die Fremdschlüssel sind(ID_TabA, ID_Tab_B sind Fremdschlüssel in Tabelle C von Tabelle A und B) wird es automatisch angelegt. oder wo ist mein Denkfehler?


DANKE


----------



## Joose (13. Feb 2015)

Nein da wird nichts automatisch angelegt, diese Verbindung musst du herstellen und auch so eintragen. (Woher soll eine Datenbank wissen welche Datensätze "verbunden" sind? Bzw. werden oft noch zusätzliche Daten gespeichert und diese kann sich eine Datenbank nicht ausdenken)
Sprich: Du musst einen Datensatz in Tabelle C eintragen, dieser Datensatz muss/kann die Fremdschlüssel von A bzw. B enthalten (und alle weiteren benötigten Daten).


----------



## vikil (13. Feb 2015)

Hallo Joosse,
dankte erstmall für deine Mühe. Habs nochmal nachgelesen und mir ist ein LICHT aufgegangen. 
Kurze Frage noch
Wenn ich in Tabelle A und B Datensätze speichere, wie bekomme ich die IDs von Tabelle A und B (da diese erst beim speichern angelegt werden), um diese in Tabelle alls Fremdschlüssel in Tabelle C einzuragen.

Viiiiiiiiiilen Dank


----------



## Joose (16. Feb 2015)

Sollten die Keys per AUTO INCREMENT erstellt werden so bieten dir viele SQL Treiber die Möglichkeit an die zuletzt erstellte ID abzufragen. So kannst du diese gleich deinem Java Objekt zuweisen.


----------



## vikil (19. Feb 2015)

Hallo Joose,
binn erst jetzt wieder dazugekommen.

Habe inzwischen auch was gefunden


```
String sql_projekt_ID = "select  last_insert_rowid()";
           pst = conn.prepareStatement(sql_projekt_ID);
            rs = pst.executeQuery();
            System.out.println(rs+" : "+ pst);
```

bekomme die Referenz von dieser ID. kannst mir sagen wie ich diese in Integer wandele?

DANKE


----------



## Joose (20. Feb 2015)

"rs" ist nur ein ResultSet das du natürlich auslesen musst. Es sollte so eigentlich nur einen Datensatz mit einer Spalte beinhalten wo die ID drinnen steht..
Sprich was du ausgibst ist die Referenz des ResultSet und nicht von der ID

Hier ein Link zu dazu: java - How to get the insert ID in JDBC? - Stack Overflow


----------



## vikil (20. Feb 2015)

Ok. VIelen Dank,
werde es mir anschauen.

DANKE


----------

