Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Hilfe bei ALTER TABLE ADD CONSTRAINT FOREIGN KEY

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von DatabaseNoob, 28 August 2015.

  1. DatabaseNoob

    DatabaseNoob Neuer Benutzer

    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 von einem Moderator bearbeitet: 29 August 2015
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. DatabaseNoob

    DatabaseNoob Neuer Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. DatabaseNoob

    DatabaseNoob Neuer Benutzer

    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?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    @ukulele dann sollte eine andere Fehlermeldung kommen.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    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...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden