# Hilfe bei erstellen einer DB



## MrSnake (24. Apr 2016)

Ich bin derzeit in einer Umschulung zum Anwendungsentwickler und das Thema MySQL war bisher noch nicht bei uns dran - daher benötige ich beim erstellen einer Datenbank für ein privates Projekt Hilfe.

Es ist keine riesengroße DB - es sind nur 3 Tabellen enthalten. Diese sollen untereinander Verknüpft werden

Haupttabelle: Troops
- TroopName (VarChar)
- Kingdom (Integer)
- Type (Integer)

Hilfstabelle: Kingdoms
- KingdomNr (Integer)
- Kingdom (VarChar)

Hilfstabelle: Types
- TypeNr (Integer)
- Type (VarChar)

Die Integerwerte der Hilfstabellen sollen dabei automatisch vergeben werden sobald eine neuer Datensatz eingetragen wird. Die Integerwerte der Haupttabelle sollen dann mit den Integerwerten der Hilfstabelle verknüpft werden.

WAS muss ich WO einstellen damit dies funktioniert?
Ich hab schon einiges probiert mit PrimaryKey und Unique aber das hat alles nicht funktioniert. MySQL ist bisher noch ein Buch mit Sieben Siegeln - ich brauch die Datenbank aber damit ich weiter an meinem privaten Java-Projekt arbeiten kann...

Könnte mir bitte jemand helfen?


----------



## Thallius (24. Apr 2016)

Womit versuchst du die DB denn zu erstellen ?

Ansonsten sollte deine Haupttabelle auch einen autoincrement index haben, wie eigentlich jede Tabelle.

also

CREATE TABLE troops (troop_id INT AUTO_INCREMENT PRIMARY KEY, troop_name VARCHAR(XXX), INDEX USING BTREE (troop_name), troop_kingdom INT, troop_type INT)

Ich habe mal einen Index auf den Namen gesetzt. Keine Ahnung ob du den brauchst aber dann weißt du auch wie das geht.

Den anderen Tabellen ensprechend.


----------



## MrSnake (24. Apr 2016)

Ich hab die DB direkt über XAMPP im phpMyAdmin angelegt.

Die Haupttabelle braucht eigentlich (meiner Meinung nach) keine Nummerierung der Einheiten - der Name jeder Einheit ist einzigartig. 

Wenn ich Daten bei Kingdoms einfügen will schreibt er mir
INSERT INTO `kingdoms`(`kingdomnr`, `kingdom`) VALUES ([value-1],[value-2])

Dabei sollte er eigentlich nur den zweiten Wert von mir haben wollen und den ersten automatisch erstellen.

Die Frage ist halt - was stell ich phpMyAdmin unter Struktur bei den Hilfstabellen und der Haupttabelle ein?
Wenn ich Dein Beispiel richtig verstehe Thallius, dann muss ich bei den Hilfstabellen die KingdomNr bzw TypeNr auf Index stellen und nicht PrimaryKey oder Unique auswählen. Muss ich dann bei der Haupttabelle für die Spalten auch was einstellen damit er weiß dass diese Ziffern auf den Index der Hilfstabelle verweisen?


----------



## Joose (25. Apr 2016)

MrSnake hat gesagt.:


> Dabei sollte er eigentlich nur den zweiten Wert von mir haben wollen und den ersten automatisch erstellen.


Dann musst du das AUTO_INCREMENT einstellen



MrSnake hat gesagt.:


> Die Frage ist halt - was stell ich phpMyAdmin unter Struktur bei den Hilfstabellen und der Haupttabelle ein?
> Wenn ich Dein Beispiel richtig verstehe Thallius, dann muss ich bei den Hilfstabellen die KingdomNr bzw TypeNr auf Index stellen und nicht PrimaryKey oder Unique auswählen. Muss ich dann bei der Haupttabelle für die Spalten auch was einstellen damit er weiß dass diese Ziffern auf den Index der Hilfstabelle verweisen?


Nein bei der Hilfstabelle kannst du KingdomNr als PrimaryKey lassen, in deiner Haupttabelle muss Kingdom dann ein ForeignKey sein.


----------



## Thallius (25. Apr 2016)

Joose hat gesagt.:


> Nein bei der Hilfstabelle kannst du KingdomNr als PrimaryKey lassen, in deiner Haupttabelle muss Kingdom dann ein ForeignKey sein.



Jetzt wirst du ihn komplett verwirren *G

Gruß

Claus


----------



## MrSnake (30. Apr 2016)

Ich hab mich jetzt wieder hinter meine DB geklemmt und konnte das Problem mit dem Auto-Increment lösen! Jetzt hänge ich aber bei den Verknüpfungen fest...

Ich bin im Designer und möchte folgende Verknüpfung erstellen:

Tabelle: kingdoms
Spalte: kingdom_nr - INT(2), Primärschlüssel

mit

Tabelle: troops
Spalte: kingdom - INT(2)

Dabei kommt jedoch die Fehlermeldung "Fehler: Fehlender Index über Spalte(n)"
Tante Google hat mir bisher nicht wirklich verraten können wo ich etwas übersehe...


----------



## MrSnake (1. Mai 2016)

Nach mehrfachem löschen und neu importieren der DB hab ich es doch tatsächlich alleine hinbekommen^^

Wenn ich nun eine Anfrage an die DB sende und ein Resultset mit Zeilen fülle bekomme ich natürlich erstmal nur eine Zeile mit einem String (dem Namen einer Einheit) und mehreren Zahlen, die Zahlen sind ja mit anderen Tabellen verknüpft...

Mein jetziges Query für das Resultset -> SELECT * FROM `troops`;

Nun versuche ich natürlich die Zahlen direkt durch die Werte aus den Hilfstabellen zu ersetzen - das klappt leider nicht wirklich - kann bitte jemand meinen Syntax korrigieren:

SELECT troop_name, kingdoms.kingdom_name, types.type
FROM troops
JOIN kingdoms WHERE troops.kingdom=kingdoms.kingdom_nr
JOIN types WHERE troops.type=types.type_nr;


Wenn ich nur den Punkt mit JOIN kingdoms nehme klappt es noch - sobald ich JOIN types dazunehme ist Ende^^

*MySQL meldet: *



#1064 - You have an error in your SQL syntax;


----------



## Thallius (1. Mai 2016)

Es muss ON heissen und nicht WHERE.....

WHERE bezieht sich immer auf die gesammte Abfrage und kann nur einmal vorkommen, nämlich hinter allen FROM und JOINS....


----------



## MrSnake (1. Mai 2016)

Danke, so funktioniert es!
Somit bleibt nur noch ein letztes Problem und das Thema hier ist endlich gegessen^^

In der Haupttabelle "troops" sind 2 Spalten "mana1" und "mana2" die beide mit der Hilfstabelle "mana_types verknüpft sind - jetzt muss ich in meinem query das ganze nur noch korrekt unterbringen dass er beide Werte aus der gleichen Hilfstabelle holt...

Mit diesem query holt er mir schonmal den String für mana1 - wie krieg ich da jetzt noch aus der gleichen Hilfstabelle den String für mana2?


```
SELECT troop_name, kingdoms.kingdom, types.type, mana_types.mana, cost, rarities.rarity
FROM troops
JOIN kingdoms ON troops.kingdom=kingdoms.kingdom_nr
JOIN types ON troops.type=types.type_nr
JOIN mana_types ON troops.mana1=mana_types.mana_nr
JOIN rarities ON troops.rarity=rarities.rarity_nr
ORDER BY troop_name
```

Zur besseren Übersicht hab ich mal ein Bild vom Designer zugefügt...


----------



## Thallius (1. Mai 2016)

```
SELECT troop_name, kingdoms.kingdom, types.type, mana_types.mana, cost, rarities.rarity
FROM troops
JOIN kingdoms ON troops.kingdom=kingdoms.kingdom_nr
JOIN types ON troops.type=types.type_nr
JOIN mana_types AS mana1 ON troops.mana1=mana1.mana_nr
JOIN mana_types AS mana2 ON troops.mana2=mana2.mana_nr
JOIN rarities ON troops.rarity=rarities.rarity_nr
ORDER BY troop_name
```


----------



## Thallius (1. Mai 2016)

Es ist übrigens keine feine Art aufzählende Spalten zu verwenden. In Deinem Fall als mana1, mana2 etc. Dafür benutzt man CrossreferenzTabellen. 

Sprich du legst eine Tabelle an

xtroopsmana

troopnr
mananr

und schon kann jede Truppe soviel mana haben wie es will.


----------



## MrSnake (1. Mai 2016)

Scheint nicht zu funktionieren - es kommt die Meldung:

Unknown column 'mana_types.mana' in 'field list'

Muss dann oben in der SELECT Zeile noch etwas angepasst werden?

Das mit dem CrossReferenz wird nach kurzem einlesen schon ein wenig zu tief für mich in der Materie. Laut Plan habe ich aber in 3 Wochen meinen MySQL Block in der Umschulung - da werde ich sowas sicherlich auch noch beigebracht bekommen!


----------



## Thallius (1. Mai 2016)

Thallius hat gesagt.:


> ```
> SELECT troop_name, kingdoms.kingdom, types.type, mana1.mana, mana2.mana, cost, rarities.rarity
> FROM troops
> JOIN kingdoms ON troops.kingdom=kingdoms.kingdom_nr
> ...



Sorry aber da hättest jetzt auch selber drauf kommen können....


----------

