# Einfache Datenbankabfrage



## Hallo123 (28. Mai 2011)

Folgende Ausgangssituation: Ich habe zwei Tabellen, in beiden ist der Primärschlüssel eine simple Zahl. Ich will das mit jedem Anlegen eines neuen Datensatzes, egal in welche der beiden Tabellen diese Zahl sich um eins erhöht, sprich:
Erster Eintrag in Tabelle 1 hat pnr(primärschlüssel) 1, der zweite in Tabelle 2 soll dann nicht die 1 erhalten können, sondern die 2. 

Hintergrund dafür ist, dass es von einer GUI aus nicht einsehbar ist, ob eine Zahl bereits in einer anderen Tabelle existiert und für den Abruf jede Zahl nur einmal existieren soll. Ich suche als noch einer Art while Methode, die diesen SQL Zugriff steuert. Ich hoffe es ist einigermaßen verständlich.


----------



## Lodorvonhal (28. Mai 2011)

Also es kommt schon mal drauf an was für eine Datenbank zu nutzt. Einige DBMS unterstützen auto increment. damit kannst du eine ID immer erhöhen. 

Das kannst du dan abrufen und hast somit die anzahl der Datensätze.

In anderen DBMS müsstest du mit Sequenzen arbeiten.


----------



## Hallo123 (28. Mai 2011)

Ich nutze InnoDB, würde es aber dennoch erstmal lieber auf eine andere Art probieren. Also angenommen ich wähle in meiner GUI über zwei Radiobuttons in welcher Tabelle der Datensatz angelegt wird. Beim Anlegen soll er also mit der Zahl 1 anfangen und bei beiden tabellen abfragen ob die 1 existiert und wenn ja um 1 erhöhen bis diese nicht mehr in den tabellen existiert und dann den neuen Datensatz mit der entsprechenden aufaddierten Nummer anlegen. 

Oder funktioniert das auto increment derart leicht? 

Würde mich über Codes sehr freuen, da ich ehrlich gesagt keine Ahnung habe wie ich das anstellen soll


----------



## Hallo123 (28. Mai 2011)

Anzumerken wäre ja auch, dass er im Falle von auto increment zwei Tabellen berücksichtigen müsste.


----------



## Lodorvonhal (28. Mai 2011)

Das DBMS kenn ich leider nicht.
wenn das deine Datenbank unterstüzt ist das autoincrement sehr simpel. 
bei MySQL unterstützt es zb. schau mal hier  MySQL :: MySQL 5.0 Reference Manual :: 3.6.9 Using AUTO_INCREMENT

du legst für deine Tabelle einen index an. In der regel ID dieser wird mit "AUTO_INCREMENT" beschrieben


```
CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
```

Das Bsp. zeigt wie sowas gemacht wird.

wenn du jetzt einen neuen Datensatz in der tabelle erzeugst wird die ID vom dem DBMS automatisch erhöht. diese ID kannst du dir ja dann an anderer stelle abrufen und überprüfen welches die höchste momentan ist.

@dit sehe gerade das dein InnoDB auf Mysql5 aufbaut. müsste also alles funzen wie ich es beschrieben habe.


----------



## Marcinek (28. Mai 2011)

Sein DBMS ist MySQL mit Tabellen vom Typ InnoDB. Diese erlauben ein Transaktionshandling


----------



## Hallo123 (28. Mai 2011)

Also funktioniert die abfrage auch über mehrere tabellen?Sry dass ich so dumm fragen muss aber sitze gerade vorm Handy und kann es nicht testen


----------



## Marcinek (28. Mai 2011)

Ja, wenn m an es richtig macht.


----------



## Hallo123 (28. Mai 2011)

Hört sich ja beruhigend an...kannst du kurz allgemein erklären wie das auszusehen hat oder wird das im oben geposteten Tutorial erklärt?


----------



## Marcinek (28. Mai 2011)

Ich schlage vor du schaust dir das Tutorial an und nutz ein wenig logisches Denken, dann klappt das.


----------



## Hallo123 (28. Mai 2011)

Ich habe das beschämende Gefühl, dass es mit der Logik nicht sonderlich gut bei mir funktioniert und google will mir nur ausspucken, dass auto_increment nicht über 2 tabellen hinweg funktioniert. Kann mir ncith einer ein Beispiel liefern wie das funktionieren könnte?


----------



## Marcinek (29. Mai 2011)

Du musst eine dritte Tabelle nutzen um die IDs für die anderen beiden zu verwalten.


----------



## faetzminator (29. Mai 2011)

Ich würde mir da auch eine dritte Tabelle erstellen. Diese benötigt 3 Informationen: Die eigene ID (die du willst), die ID (primary) der anderen Tabelle und irgendwie noch die Information, in welcher Tabelle dieser Datensatz nun ist.


----------



## Spacerat (30. Mai 2011)

Also in diesem Fall mal ganz banal... Sofern es nur 2 Tabellen sind, die zusammengefügt werden sollen, genügt eine 3. Tabelle mid den Feldern (ID-Map):

1. id (int)
2. table1_id
3. table2_id

Unmittelbar nachdem in Tabelle 1 ein Datensatz eingefügt wurde, muss sich die Insert-ID dieses Datensatzes geholt und zwischengespeichert werden. Danach erst sollte man den entsprechenden Datansatz in Tabelle 2 einfügen und sich ebenfalls die Insert-ID holen. Diese beiden IDs speichert man nun halt in der 3. Tabelle. Die nun zurück gelieferte Insert-ID ist das gültige auto_increment für beide Tabellen.

Was ich mich Frage: Warum ist's denn wichtig, dass ein primärer Index auf 2 Tabellen angewendet werden soll? Jene Indexschlüssel sollten in Datenbanken wirklich nur zur Identifizierung eines Datensatzes zwecks schnelleren Zugriff dienen. Ist, wenn man so will, wie mit Namenskonventionen in einer Programmiersprache - man kann es beachten, muß man aber nicht


----------



## maki (30. Mai 2011)

*verschoben*


----------

