Hilfe bei ALTER TABLE ADD CONSTRAINT FOREIGN KEY

DatabaseNoob

Neuer Benutzer
Beiträge
3
Ja moin liebes Forum.
Ich benötige ein bisschen Hilfe und hoffe jemand kann mir helfen.
Ich bastel an einer Datenbank für ein Online-Spiele-Versandhaus (OSVH).
Die Datenbank soll anzeigen können welcher Kunde wann welches Spiel gekauft hat. Dazu sollen noch kritische Kundendaten (Bankdaten, Kreditkarte und PayPal) in verschiedenen Tabellen gespeichert werden.
Nun zu meinem Problem: Ich kriege es nicht hin die Fremdschlüssel einzufügen. Am liebsten würde ich dies mit dem ALTER TABLE Befehl machen.


Hier mein Code bisher:
Code:
CREATE DATABASE IF NOT EXISTS OSVH;
USE OSVH;
SET FOREIGN_KEY_CHECKS = 0;


CREATE TABLE IF NOT EXISTS Spiel (
   SpieleNr SERIAL,
   Titel VARCHAR(100),
   Preis INTEGER,
   FSK INTEGER,
   Konsole VARCHAR (25),
   GenreNr INTEGER,
   HerstellerNr INTEGER,
   PRIMARY KEY (SpieleNr)
   ) ENGINE = INNODB;
      
CREATE TABLE IF NOT EXISTS Kunde (
   KundenNr SERIAL,
   KName VARCHAR(50),
   Geburtsdatum DATE,
   E_Mail VARCHAR (50),
   Strasse_Nr VARCHAR (50),
   PLZ INTEGER,
   Ort VARCHAR (50),
   PayPal_Adresse VARCHAR (50),
   KartenNr INTEGER,
   IBAN VARCHAR (25),
   PRIMARY KEY (KundenNr)
   ) ENGINE = INNODB;
    
CREATE TABLE IF NOT EXISTS Hersteller (
     HerstellerNr SERIAL,
     HName VARCHAR (50),
     PRIMARY KEY (HerstellerNr)
     ) ENGINE = INNODB;
                
CREATE TABLE IF NOT EXISTS Kauft (
     KundenNr INTEGER NOT NULL,
     SpieleNr INTEGER NOT NULL,
     Kaufdatum DATE,
     Bezahlart VARCHAR (25),
     PRIMARY KEY (KundenNr, SpieleNr)
     ) ENGINE = INNODB;
            
CREATE TABLE IF NOT EXISTS Genre (
     GenreNr SERIAL,
     GName VARCHAR (25),
     PRIMARY KEY (GenreNr),
     SpieleNr BIGINT UNSIGNED DEFAULT 1
     ) ENGINE = INNODB;    
        
CREATE TABLE IF NOT EXISTS Bankdaten (
     IBAN SERIAL,
     BName VARCHAR (30),
     PRIMARY KEY (IBAN)
     ) ENGINE = INNODB;
            
CREATE TABLE IF NOT EXISTS Kreditkarte (
     KartenNr SERIAL,
     gültig_bis INTEGER(6),
     CVV INTEGER (3),
     PLZ INTEGER (5),
     PRIMARY KEY (KartenNr)
     ) ENGINE = INNODB;
            
CREATE TABLE IF NOT EXISTS PayPal (
     PayPal_Adresse SERIAL,
     PRIMARY KEY (PayPal_Adresse)
     ) ENGINE = INNODB;
    
    

INSERT INTO Spiel (SpieleNr, Titel, Preis, FSK, Konsole, GenreNr, HerstellerNr) VALUES
   (103, 'FuFA', 50, 1, 'PS4', 5, 8);
  
INSERT INTO Kunde (KundenNr, KName, E_Mail, Geburtsdatum, Strasse_Nr, PLZ, Ort, PayPal_Adresse, KartenNr, IBAN) VALUES
   (65, 'Hans Moritz', 'Hansi01@live.de', 16011997, 'Credenstreet 25', 33624, 'Musterstadt', 'Hansi01@live.de', 0, 0);
  
INSERT INTO Hersteller (HerstellerNr, HName) VALUES
   (880, 'EA');
    
INSERT INTO Kauft (KundenNr, SpieleNr, Kaufdatum, Bezahlart) VALUES
   (953, 103, 2015-08-02, 'PayPal');  
  
INSERT INTO Genre (GenreNr, GName) VALUES
   (231, 'Sport');    
  
INSERT INTO Bankdaten (IBAN, BName) VALUES
   ('DE65255145664545', 'Sparkasse');
  
INSERT INTO Kreditkarte (KartenNr, gültig_bis, CVV, PLZ) VALUES
   (5666589855, 102016, 569, 32052);
  
INSERT INTO PayPal (PayPal_Adresse) VALUES
     ('Hansi01@live.de');


ALTER TABLE Spiel
   ADD CONSTRAINT fkSpielGenre FOREIGN KEY (GenreNr)
   REFERENCES Genre(GenreNr);
  
  
ALTER TABLE Spiel
   ADD CONSTRAINT fk_Spiel_Hersteller FOREIGN KEY (HerstellerNr)
   REFERENCES Hersteller(HerstellerNr);
  
  
ALTER TABLE Kunde
   ADD CONSTRAINT fk_Kunde_paypal FOREIGN KEY (PayPal_Adresse)
   REFERENCES PayPal(PayPal_Adresse);
  
  
ALTER TABLE Kunde
   ADD CONSTRAINT fk_Kunde_Kreditkarte FOREIGN KEY (KartenNr)
   REFERENCES Kreditkarte(KartenNr);
  
ALTER TABLE Kunde
   ADD CONSTRAINT fk_Kunde_Bankdaten FOREIGN KEY (IBAN)
   REFERENCES Bankdaten(IBAN);
  
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;



Was habe ich falsch gemacht? Wahrscheinlich sehr viel. Bin leider noch kein Profi in Sachen MySQL.

Danke für jede Hilfe.

MfG ^^
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
IIRC kennt MySQL kein SERIAL, das ist ein Datentyp in PostgreSQL. (wohl auch Oraggle)

Umlaute in Spaltenbezeichnern sind Murks. PLZ als INT ist Murks. Keine Fehlermeldungen zu zeigen ist Murks.
 
ah das wichtigste vergessen.
Error code: 1005
Can't create table 'osvh.#sql-1980_4' (errno: 150)

Könntest du bitte erläutern, warum PLZ als INT nicht gut ist.
Und wo sind Umlaute? (Bitte Zeile angeben).
Bei SERIAL wird nicht gemeckert. Wahrscheinlich hab ich ins falsche Forum gepostet. Programm zum schreiben nennt sich SQLyog. Weiß ehrlich gesagt auch nicht was der unterschied zu MySQL ist.
 
Die Fehlermeldung bei MySQL ist: "MySQL error code 150: Foreign key constraint is incorrectly formed".

Deine Syntax funktioniert aber mit PostgreSQL. Umlaute hast Du bei "gültig_bis". Da würde ich übrigens kein INT als Datentyp erwarten. Warum INT für PLZ Murks ist? Dresden hat 01069. Das als Int gespeichert und wieder ausgelesen macht 1069. Du siehst den Unterschied? Der Unterschied zwischen MySQL und PostgreSQL ist übrigens gigantisch.
 
Okay, danke schonmal.
Kann das hier dann jemand an den richtigen Ort verschieben?

Aber warum die ALTER TABLE Befehle nicht funktionieren erklärt das immer noch nicht. Fehlt da irgendwo ein Zeichen? Muss an den Tabellen selber noch was geändet werden?
 
Bei geht dies:

Code:
test=# create table bla(id serial primary key);
CREATE TABLE
test=*# create table blubb(bla_id int);
CREATE TABLE
test=*# alter table blubb add constraint fk_bla foreign key (bla_id) references bla;
ALTER TABLE

Geht das bei Dir?
 
SQLyog scheint nur ein Client zu sein, MySQL kann also durchaus zutreffen.

Du erstellst erst Tabellen, fügst dann Daten ein und erstellst dann Fremschlüssel. Probier mal erst die Schlüssel einzufügen und dann die Daten, vieleicht haben deine Demo Datensätze ja bereits Inkonsitenzen.
 
Werbung:
Code:
test=# create table bla(id serial primary key);
CREATE TABLE
test=*# create table blubb(bla_id int);
CREATE TABLE
test=*# insert into blubb values (1);
INSERT 0 1
test=*# alter table blubb add constraint fk_bla foreign key (bla_id) references bla;
ERROR:  insert or update on table "blubb" violates foreign key constraint "fk_bla"
DETAIL:  Key (bla_id)=(1) is not present in table "bla".
STATEMENT:  alter table blubb add constraint fk_bla foreign key (bla_id) references bla;
ERROR:  insert or update on table "blubb" violates foreign key constraint "fk_bla"
DETAIL:  Key (bla_id)=(1) is not present in table "bla".

So sollte das aussehen, wenn der Constraint nicht gesetzt werden kann. Soweit ich weiß prüft MySQL aber das gar nicht...
 
Zurück
Oben