mysql Datenbank Test

bySwift

Ensign
Registriert
Jan. 2019
Beiträge
223
Hallo Zusammen,
Ich habe mir gerade eine Datenbank zum testen angelegt und wollte jetzt die Einträge machen.

Code:

PHP:
CREATE TABLE Länder.Wohnsitz (
Name VARCHAR (255),
Größe Int,
Land Text,
PRIMARY KEY (Name));
;

PHP:
CREATE TABLE Länder.Personen (
Id Int NOT NULL AUTO_INCREMENT,
Vorname Text,
Nachname Text,
PRIMARY KEY (Id)),
FOREIGN KEY (Name) REFERENCES wohnsitz (Name));
;

Wenn ich in der Länder.Personen Relation bin möchte ich den Namen als Fremdschlüssel übergeben und die Referenz beziehe ich aus der Relation Wohnsitz. Was aber nicht so klappen möchte. Ich finde den fehler nicht warum es nicht klappt.

Das ist der Fehler Code womit ich nichts anfangen kann...

PHP:
[SIZE=7][B]Fehler[/B][/SIZE]
[B]Statische Analyse:[/B]

1 Fehler wurden während der Analyse gefunden.



[LIST=1]
[*]Unerkannte Statement-Typ. (near "Name" at position 139)
[/LIST]


[B]SQL-Befehl:[/B]


CREATE TABLE Länder.Personen ( Id Int NOT NULL AUTO_INCREMENT, Vorname Text, Nachname Text, PRIMARY KEY (Id)), FOREIGN KEY (Name) REFERENCES wohnsitz (Name))


[B]MySQL meldet: [/B][URL='http://localhost/phpmyadmin/url.php?url=https%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.7%2Fen%2Ferror-messages-server.html'][IMG alt="Dokumentation"]http://localhost/phpmyadmin/themes/dot.gif[/IMG][/URL]

#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei '

FOREIGN KEY (Name) REFERENCES wohnsitz (Name))' in Zeile 9
;
 
Andreas_ schrieb:
Du hast keine Spalte "Name" in der Tabelle Länder.Personen.
Müsste ich da jetzt auch nochmal Name VARCHAR (255), anlegen oder wie ist das gemeint
 
Du weißt schon, was ein Fremdschlüssel ist? Eine Spalte in der aktuellen Tabelle referenziert auf eine Spalte in einer anderen Tabelle.
SQL:
FOREIGN KEY (Spalte in aktueller Tabelle) REFERENCES andere Tabelle (Spalte in anderer Tabelle));
 
Andreas_ schrieb:
Du weißt schon, was ein Fremdschlüssel ist? Eine Spalte in der aktuellen Tabelle referenziert auf eine Spalte in einer anderen Tabelle.
SQL:
FOREIGN KEY (Spalte in aktueller Tabelle) REFERENCES andere Tabelle (Spalte in anderer Tabelle));
Ja das weiß ich. Das ist aber erst meine zweite DB...

SQL:
CREATE TABLE Länder.Personen (
Id Int NOT NULL AUTO_INCREMENT,
Vorname Text,
Nachname Text,
Name VARCHAR (255),
PRIMARY KEY (Id)),
FOREIGN KEY (Name) REFERENCES wohnsitz (Name));

Müsste das dann so sein ?
 
Andreas_ schrieb:
So sollte es klappen.
Leider nicht...

1580207067293.png
 
poberach schrieb:
Zeile 6: Entferne mal die zweite schließende Klammer. Die beendet das Create Table Statement

Das hat dann jetzt geklappt... Anscheint vergessen die klammer weg zu machen nach dem ich den Namen neu eingetragen habe... Ich danke euch beiden für die gute hilfe und Erklärung ;)👍 @poberach @Andreas_
Ergänzung ()

Aber was ich mich noch frage ist warum die Tabellen im Designer keine Verbindung zu einander haben ?

poberach schrieb:
Zeile 6: Entferne mal die zweite schließende Klammer. Die beendet das Create Table Statement
Andreas_ schrieb:
So sollte es klappen.
 
Zuletzt bearbeitet:
Protip: KEINEN Freitext als Schlüssel. Schon gar nicht Namen, die nicht eindeutig sein können.

IDs definieren und verwenden.
 
  • Gefällt mir
Reaktionen: mental.dIseASe, snaxilian und Raijin
:confused_alt:
RalphS schrieb:
Protip: KEINEN Freitext als Schlüssel. Schon gar nicht Namen, die nicht eindeutig sein können.

IDs definieren und verwenden.
Als Primär und Fremd Schlüssel ? Hast du mal Beispiele ?

Wenn ich jetzt in der Relation Personen versuche was in der SQL was einzufügen geht das nicht.

INSERT INTO personen
VALUES
(NULL, 'id', 'Manni', 'Wanni', 'Name');

Als ich den Fremdschlüssel übergeben habe muss ich ja nochmal Name VARCHAR (255) angeben. Logisch das er eine weitere spalte anlegt. Irgendwie stehe ich total aufm Schlauch... :freak:
confused[1].gif
 
Wenn du eine Fremdschlüsselspalte für einen Datensatz in der einen Tabelle füllen willst, dann muss der Datensatz in der referenzierten Tabelle natürlich existieren. Ich empfehle: Zurück auf 0 und Datenbanktheorie pauken!
 
mental.dIseASe schrieb:
Wenn du eine Fremdschlüsselspalte für einen Datensatz in der einen Tabelle füllen willst, dann muss der Datensatz in der referenzierten Tabelle natürlich existieren. Ich empfehle: Zurück auf 0 und Datenbanktheorie pauken!

Der Datensatz steht ja in der Tabelle.

SQL:
CREATE DATABASE Länder;

CREATE TABLE Länder.Wohnsitz (
Name VARCHAR (255), Größe Int,
Land Text,
PRIMARY KEY (Name));

CREATE TABLE Länder.Personen (
Id Int NOT NULL AUTO_INCREMENT,
Vorname Text,
Nachname Text,
Name VARCHAR (255),
PRIMARY KEY (Id)),
FOREIGN KEY (Name) REFERENCES wohnsitz (Name));
 
bySwift schrieb:
Als Primär und Fremd Schlüssel ? Hast du mal Beispiele ?
Es geht darum, dass eine Datenbank üblicherweise so aussieht:

Personen
IDVornameNachnameWohnortID
1SteffiStar2
2PeterProll3
3HansHippie1
4NoraNase2
5OttoOchse1
6JuttaJung2


Wohnort
IDOrtPLZ
1Musterstadt12345
2Beispieldorf54321
3BadExempel12321

WohnortID in Personen würde dann als Foreign Key auf das Feld ID aus der Tabelle Wohnort zeigen.
Ein JOIN würde demnach auf "WohnortID = Wohnort.ID" matchen.

Mit IDs ist sichergestellt, dass man die richtige Zeile auswählt. Wenn du den Primary Key auf eine Textspalte setzt (zB Ort in obiger Wohnort-Tabelle), kann und wird es Probleme geben, wenn "Musterstadt" auch oder sogar nur als "musterstadt" auftaucht. Gerne genommen sind auch Varianten wie " Musterstadt" oder "Musterstadt ", wenn man nicht darauf achtet, Strings zu trimmen. IDs sind eindeutig und müssen nicht interpretiert werden wie es bei Strings der Fall wäre.

Durch sprechende Namen wie "WohnortID" wird zudem klar was in der Spalte steht, ohne sich im Detail mit dem Create-Statement der Tabelle auseinandersetzen zu müssen.
 
  • Gefällt mir
Reaktionen: bySwift, RalphS und Hayda Ministral
Fremdschlüssel übergeben? Die werden definiert, nicht übergeben. :confused_alt: Ich bin den ganzen Thread lang schon nicht ganz sicher, ob wir wirklich vom selben reden.

Eine Tabelle beschreibt eine Zuordnung eines abstrakten Objekts (sagen wir "Person") über deren Eigenschaften (Name, Alter, Schuhgröße, ...). Das ist Definitionssache und nennt sich entsprechend auch DDL wie Data Definition Language als Subset von SQL.

In die Tabelle rein kommen reale Instanzen dieses abstrakten Objekts. Diese haben eine Identität (sagen wir den Personalausweis) welche das Objekt eindeutig(!) identifiziert.

Weil wir hier von PC-Sachen reden und nicht von realen Plastikkarten, beschränken wir uns beispielhaft auf das, was am Personalausweis tatsächliche Relevanz hat. Das ist die PKZ.

Für unsere Tabelle ist deshalb anschaulich die PKZ Primärschlüssel. Jede Person hat exakt eine, auch Zwillinge haben jeweils eine, selbst Dolly das Klonschaf hat eine eigene; kurz, sogar dann, wenn man Person A von Person B nicht unterscheiden kann (wenn sie vor einem stehen) hat man mit der PKZ alias dem Primärschlüssel DENNOCH die Identität der Person.


Schritt Zwei, ich will die Objekte - die Personen aus meiner einen Tabelle -- in Beziehung setzen zu etwas anderem. Sagen wir der Einfachheit wegen und um unnötigen Argumenten vorzubeugen: Fahrräder. Auf ein Fahrrad paßt exakt eine Person, es hat aber auch eine Farbe, eine Felgengröße und so weiter, sprich wir haben Tabelle No 2 "Fahrrad" mit sagen wir der Rahmennummer als Primärschlüssel, ein paar Attributen wie eben der Farbe und dergleichen UND wir haben eine Referenz auf den Fahrer.

WER kann das Fahrrad fahren? Personen aus der P-Tabelle. Andere gibt es nicht, denn wenn es sie gäbe, ständen sie in der Personentabelle.

WEIL das so ist, definiere ich auf der Fahrradtabelle einen Fremdschlüssel. Das mach ich immer dann, wenn ich bereits einen logischen Verweis hab - in einem Haus wohnen Menschen = Referenz, ein Fahrrad hat wechselbare Räder = Referenz, einen Besprechungsraum kann/muß ich für Zeiteinheit X und Personen Y buchen => Multireferenz und in Datenbanksprech immer Fremdschlüssel.

Im Beispiel DEFINIERE ich also auf der Spalte "Fahrer" in der Tabelle "Fahrrad" einen Fremdschlüssel, der auf die Spalte PKZ in der Tabelle Personen verweist. Im Klartext: Wenn ich einen Eintrag in diese Spalte machen will, dann darf ich dafür NUR Werte verwenden, die sich bereits in der Spalte PKZ in Personen befinden. Fremdschlüssel heißen deswegen Constraints (gibt auch andere).

Jetzt kann ich Personen haben
PKZ Name Vorname Geburtsdatum
1 Peter Meier 01.01.2000
2 Gerhard Schöne 02.02.1990
3 Peter Meier 01.01.2000

und Fahrräder
ID Farbe Fahrer
1 blau 2
2 rot 3
3 blau 1
4 gelb null

und habe so DREI Personen auf DREI Fahrräder gesetzt. Daß Person "1" und Person "3" denselben Namen haben und am selben Tag geboren worden... ist mehr oder weniger selten, kommt aber vor. Mit einer extra Spalte Haarfarbe hätten wir das ggfs gesehen - einer ist blond, einer nicht -- aber die Daten haben wir nicht.
Bei den Fahrrädern dasselbe. Wir haben zwei blaue Räder, ein rotes. Die Farbe genügt daher nicht als Identität für das Rad, ebensowenig wie die Felgengröße oder die Sattelfarbe oder das Modell oder irgend etwas; man kann buchstäblich immer zwei identische Räder gleichzeitig im Schuppen haben und dann sind es auch zwei Räder... und nicht eins.

Gäbe es den definierten Fremdschlüssel NICHT, dann könnte ich für den Fahrer von Rad #4 einfach eine 15 eintragen. Hindert mich niemand daran.

Problem ist nur, es gibt gar keine Person mit der 15. In Datenbanksprech ist damit die referentielle Integrität verletzt - es wird Bezug genommen auf eine Person, die nicht existiert, und der Versuch wird notwenigerweise fehlschlagen.

Die einzige Ausnahme von "Wert muß in der referenzierten Schlüsselspalte existieren" ist NULL wie "nicht bekannt". Das liegt im eigenen Ermessen, was möglich sein muß und was nicht. Im Beispiel ist NULL für Fahrer in der Tabelle Fahrrad erlaubt - wenn man es kauft, sitzt noch niemand im Sattel und diesen Umstand "ich kann nicht sagen, wer da sitzt" gebe ich mit dem Wert NULL an.

Primärschlüssel dagegen DÜRFEN diesen Wert NICHT annehmen, da der PK das Objekt identifiiziert und wenn der PK NULL werden könnte, dann hab ich buchstäblich eine nicht identifizierbare Person in meiner Tabelle.


Näheres zum Thema findet sich in einschlägigen Tutorials sowie in Texten zum Datenbankdesign.
 
  • Gefällt mir
Reaktionen: t4ub3 und bySwift
Habe mir nochmal die Zeit genommen um eine neue anzulegen und mir das alles richtig durch zu lesen.

SQL:
    create table benutzer_daten.data (
        BenutzerID INT NOT NULL AUTO_INCREMENT,
        Vorname Text,
        Nachname Text,
        Anschrift Text,
        Land Text,
        PRIMARY KEY (BenutzerID));
       
    create table benutzer_daten.receipt (
        RechnungsID Int NOT NULL AUTO_INCREMENT,
        Wahleistungsstelle Text,
        BenutzerID Int,
        PRIMARY KEY (RechnungsID),
        FOREIGN KEY (BenutzerID) REFERENCES data (BenutzerID));
       
    create table benutzer_daten.KeyAccount
        KeyAccountID Int NOT NULL AUTO_INCREMENT,
        Startdatum date,
        Enddatum date,
        RechnungsID Int,
        PRIMARY KEY (KeyAccountID),
        FOREIGN KEY (RechnungsID) REFERENCES receipt (RechnungsID);
       
                                                          Benuter Anlegen Test
       
        INSERT INTO data
    (`BenutzerID`, `Vorname`, `Nachname`, `Anschrift`, `Land`)
    VALUES (NULL ,'Walter','Schmitz','Katzenweg 3','Deutschland');

Den Inhalt muss man nicht verstehen, der hatte keinen richtigen zweck. war einfach rein um dafür ein gefühl zu bekommen...
 
Ob man den Primary Key mit TabelleID definiert oder einfach nur mit ID da scheiden sich die Geister (bei den FKs ist es hingegen in jedem Fall angebracht sie TabelleID zu nennen). Ich habe schon oft mit Kollegen und Bekannten darüber diskutiert und es ist wohl ein immerwährender Konflikt zwischen beiden Philosophien. Das grenzt manchmal schon an Diskussionen zwischen Windows- und Linux-Nutzern ;)
 
Andreas_ schrieb:
Ich empfehle Dir, keine reservierten Wörter als Bezeichner für Tabellen oder Spalten zu verwenden. "data" ist eins davon. Eine Übersicht findest Du hier: MySQL 8.0 Keywords and Reserved Words
Werde ich mir mal anschauen. Danke für den Tipp :)

Raijin schrieb:
Ob man den Primary Key mit TabelleID definiert oder einfach nur mit ID da scheiden sich die Geister (bei den FKs ist es hingegen in jedem Fall angebracht sie TabelleID zu nennen). Ich habe schon oft mit Kollegen und Bekannten darüber diskutiert und es ist wohl ein immerwährender Konflikt zwischen beiden Philosophien. Das grenzt manchmal schon an Diskussionen zwischen Windows- und Linux-Nutzern ;)

Die streitigkeiten kenne ich auch zu gut... :D
 
Zurück
Oben