+ Antworten
Ergebnis 1 bis 4 von 4

Thema: Fremdschlüssel Error 150

  1. #1
    TP-Newbie DerLohmi macht alles soweit korrekt
    Registriert seit
    Nov 2010
    Ort
    Dithmarschen
    Beiträge
    3

    Fremdschlüssel Error 150

    Hallo Gemeinde,

    ich Doktor nun schon ein paar Stunden an 'nem SQL-Script rum. Die Datenbank habe ich erstellt mit DBDesignerFork. Wenn ich die Tabellen nun anlege, bekomme ich immer folgenden Fehler:

    Code:
    SQL-Befehl:
    
    CREATE TABLE fahrzeug(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT ,
    einsatztyp_id INTEGER UNSIGNED NOT NULL ,
    kennzeichen VARCHAR( 25 ) NULL ,
    sitzplaetze INTEGER UNSIGNED NULL ,
    bemerkung TEXT NULL ,
    PRIMARY KEY ( id, einsatztyp_id ) ,
    INDEX FK_einsatztyp( einsatztyp_id ) ,
    UNIQUE INDEX fahrzeug_unique( kennzeichen ) ,
    FOREIGN KEY ( einsatztyp_id ) REFERENCES einsatztyp( id ) ON DELETE SET NULL ON UPDATE SET NULL
    ) TYPE = InnoDB;
    
    MySQL meldet: Dokumentation
    #1005 - Can't create table './itprojekt/fahrzeug.frm' (errno: 150)
    Die beiden Tabellen Mitarbeiter und Abteilung sind doch genauso aufgebaut wie Fahrzeuge und einsatztyp. Wieso funktioniert das dort nicht?? Hier nochmal der gesamte Code:

    Code:
    CREATE TABLE kunden (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      vorname VARCHAR(25)  NULL  ,
    
      nachname VARCHAR(25)  NULL  ,
    
      strasse VARCHAR(25)  NULL  ,
    
      plz INT  NULL  ,
    
      ort VARCHAR(25)  NULL    ,
    
    PRIMARY KEY(id))
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE linien (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      name VARCHAR(25)  NULL  ,
    
      beschreibung TEXT  NULL    ,
    
    PRIMARY KEY(id))
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE reisen (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      von DATE  NOT NULL  ,
    
      bis DATE  NOT NULL  ,
    
      name VARCHAR(25)  NULL  ,
    
      beschreibung TEXT  NULL  ,
    
      maxteiln TINYINT UNSIGNED  NULL    ,
    
    PRIMARY KEY(id, von, bis))
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE abteilung (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      name VARCHAR(25)  NULL    ,
    
    PRIMARY KEY(id))
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE mitarbeiter (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      abteilung_id INTEGER UNSIGNED  NOT NULL  ,
    
      vorname VARCHAR(25)  NULL  ,
    
      nachname VARCHAR(25)  NULL  ,
    
      username VARCHAR(12)  NOT NULL  ,
    
      passwd VARCHAR(12)  NULL    ,
    
    PRIMARY KEY(id, abteilung_id)  ,
    
    INDEX FK_abteilung(abteilung_id)  ,
    
    UNIQUE INDEX mitarbeiter_unique(username),
    
      FOREIGN KEY(abteilung_id)
    
        REFERENCES abteilung(id)
    
          ON DELETE NO ACTION
    
          ON UPDATE CASCADE)
    
    TYPE=InnoDB;
    
    
    
    
    CREATE TABLE einsatztyp (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      name VARCHAR(25)  NULL    ,
    
    PRIMARY KEY(id))
    
    TYPE=InnoDB;
    
    
    
    
    
    CREATE TABLE fahrzeug (
    
      id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
    
      einsatztyp_id INTEGER UNSIGNED  NOT NULL  ,
    
      kennzeichen VARCHAR(25)  NULL  ,
    
      sitzplaetze INTEGER UNSIGNED  NULL  ,
    
      bemerkung TEXT  NULL  ,
    
    PRIMARY KEY(id, einsatztyp_id)  ,
    
    INDEX FK_einsatztyp(einsatztyp_id)  ,
    
    UNIQUE INDEX fahrzeug_unique(kennzeichen),
    
      FOREIGN KEY(einsatztyp_id)
    
        REFERENCES einsatztyp(id)
    
          ON DELETE SET NULL
    
          ON UPDATE SET NULL)
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE reisen_has_kunden (
    
      reisen_id INTEGER UNSIGNED  NOT NULL  ,
    
      kunden_id INTEGER UNSIGNED  NOT NULL  ,
    
      reisen_bis DATE  NOT NULL  ,
    
      reisen_von DATE  NOT NULL    ,
    
    PRIMARY KEY(reisen_id, kunden_id, reisen_bis, reisen_von)  ,
    
    INDEX FK_reisen(reisen_id, reisen_von, reisen_bis)  ,
    
    INDEX FK_kunden(kunden_id),
    
      FOREIGN KEY(reisen_id, reisen_von, reisen_bis)
    
        REFERENCES reisen(id, von, bis)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE,
    
      FOREIGN KEY(kunden_id)
    
        REFERENCES kunden(id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE);
    
    
    
    
    
    
    
    CREATE TABLE reisen_has_mitarbeiter (
    
      reisen_id INTEGER UNSIGNED  NOT NULL  ,
    
      mitarbeiter_abteilung_id INTEGER UNSIGNED  NOT NULL  ,
    
      mitarbeiter_id INTEGER UNSIGNED  NOT NULL  ,
    
      reisen_bis DATE  NOT NULL  ,
    
      reisen_von DATE  NOT NULL    ,
    
    PRIMARY KEY(reisen_id, mitarbeiter_abteilung_id, mitarbeiter_id, reisen_bis, reisen_von)  ,
    
    INDEX FK_reisen(reisen_id, reisen_von, reisen_bis)  ,
    
    INDEX FK_mitarbeiter(mitarbeiter_id, mitarbeiter_abteilung_id),
    
      FOREIGN KEY(reisen_id, reisen_von, reisen_bis)
    
        REFERENCES reisen(id, von, bis)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE,
    
      FOREIGN KEY(mitarbeiter_id, mitarbeiter_abteilung_id)
    
        REFERENCES mitarbeiter(id, abteilung_id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE);
    
    
    
    
    
    
    
    CREATE TABLE fahrzeug_linien (
    
      linien_id INTEGER UNSIGNED  NOT NULL  ,
    
      fahrzeug_id INTEGER UNSIGNED  NOT NULL  ,
    
      fahrzeug_einsatztyp_id INTEGER UNSIGNED  NOT NULL    ,
    
    PRIMARY KEY(linien_id, fahrzeug_id, fahrzeug_einsatztyp_id)  ,
    
    INDEX FK_linien(linien_id)  ,
    
    INDEX FK_fahrzeug(fahrzeug_id, fahrzeug_einsatztyp_id),
    
      FOREIGN KEY(linien_id)
    
        REFERENCES linien(id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE,
    
      FOREIGN KEY(fahrzeug_id, fahrzeug_einsatztyp_id)
    
        REFERENCES fahrzeug(id, einsatztyp_id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE)
    
    TYPE=InnoDB;
    
    
    
    
    
    
    
    CREATE TABLE fahrzeug_reisen (
    
      reisen_id INTEGER UNSIGNED  NOT NULL  ,
    
      fahrzeug_id INTEGER UNSIGNED  NOT NULL  ,
    
      reisen_bis DATE  NOT NULL  ,
    
      reisen_von DATE  NOT NULL  ,
    
      fahrzeug_einsatztyp_id INTEGER UNSIGNED  NOT NULL    ,
    
    PRIMARY KEY(reisen_id, fahrzeug_id, reisen_bis, reisen_von, fahrzeug_einsatztyp_id)  ,
    
    INDEX FK_reisen(reisen_id, reisen_von, reisen_bis)  ,
    
    INDEX FK_fahrzeug(fahrzeug_id, fahrzeug_einsatztyp_id),
    
      FOREIGN KEY(reisen_id, reisen_von, reisen_bis)
    
        REFERENCES reisen(id, von, bis)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE,
    
      FOREIGN KEY(fahrzeug_id, fahrzeug_einsatztyp_id)
    
        REFERENCES fahrzeug(id, einsatztyp_id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE);
    
    
    
    
    
    
    
    CREATE TABLE mitarbeiter_linien (
    
      linien_id INTEGER UNSIGNED  NOT NULL  ,
    
      mitarbeiter_abteilung_id INTEGER UNSIGNED  NOT NULL  ,
    
      mitarbeiter_id INTEGER UNSIGNED  NOT NULL    ,
    
    PRIMARY KEY(linien_id, mitarbeiter_abteilung_id, mitarbeiter_id)  ,
    
    INDEX FK_linien(linien_id)  ,
    
    INDEX FK_mitarbeiter(mitarbeiter_id, mitarbeiter_abteilung_id),
    
      FOREIGN KEY(linien_id)
    
        REFERENCES linien(id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE,
    
      FOREIGN KEY(mitarbeiter_id, mitarbeiter_abteilung_id)
    
        REFERENCES mitarbeiter(id, abteilung_id)
    
          ON DELETE CASCADE
    
          ON UPDATE CASCADE)
    
    TYPE=InnoDB;
    Bin für jede Hilfe dankbar

    Gruß Dennis

  2. #2
    TP-Senior blackfreeze ist auf einem guten Weg
    Registriert seit
    Oct 2004
    Ort
    Sachsen, Dresden
    Beiträge
    237
    ich glaub es liegt an der tatsache das du deinen primärschlüsselaus id & fremdschlüssel baust

    reicht dir id als primärschlüssel nicht?

    ps kennzeichen ist doch auch ein guter primärschlüssel....

  3. #3
    TP-Newbie DerLohmi macht alles soweit korrekt
    Registriert seit
    Nov 2010
    Ort
    Dithmarschen
    Beiträge
    3

    ON DELETE - Fehler

    Fehler gefunden. Attribute und Schlüssel sind schon okay so. Der Fehler war, dass, wenn ein Einsatztyp gelöscht wird, ON DELETE SET NULL war. Allerdings kann ich die einsatztyp_id in fahrzeuge nicht auf Null setzten , da es ein PK ist. Ein einfach ON DELETE auf NO ACTION gesetzt und schon funktioniert der Müll.

    Trotzdem vielen Dank
    Gruß Dennis

  4. #4
    TP-Senior blackfreeze ist auf einem guten Weg
    Registriert seit
    Oct 2004
    Ort
    Sachsen, Dresden
    Beiträge
    237
    ja stimmt wenn der primärschlussel in einsatztyp gelöscht wird würde der fremdschlüssel bei dir null werden, wenn du es aber auf no action lässt könntest du mit der konsistenz probleme bekommen bsp:
    PHP-Code:
    Tabelle EinsatzTyp
    ID       Bez
    -------------
    1        Miete
    2        Verkauf
    3        Leasing 
    PHP-Code:
    Tabelle Fahrzeug
    ID       Kennzeichen     Typ_ID
    -------------------------------
    1        DD-AS 234        2
    2        M
    -ED 1000        1
    3        D
    -GH  34          3
    4        M
    -KL  145         1 
    Das bedeutet dein PS sieht so aus : (1|2) (2|1) (3|3) (4|1)
    Wenn in EinsatzTyp ein Eintrag gelöscht wird oder sich der PS ändert, wird onDelete bzw. onUpdate getriggert und wenn die beiden gar nix machen, sieht es schlecht aus
    PHP-Code:
    DELETE FROM EinsatzTyp WHERE ID=3
    --> kein Trigger
    SELECT Bez FROM Fahrzeug
    Einsatztyp WHERE Kennzeichen="D-GH 34" AND Typ_ID Einsatztyp.ID
    --> würde voll ins Lehre greifen 
    im einfachstenfall sollte onDelete-Trigger prüfen ob noch ein FS in Fahrzeug existiert und gegebenenfalls abbrechen und onUpdate dieÄnderung durchreichen.

    noch was: so richtig versteh ich nicht wieso du dir den ps aus 2 spalten zusammen stellst, id ist doch schon eineindeutig oder etwa nicht, nen fremdschlüsselmit als ps zu definieren bringt doch nur mehr stress...

+ Antworten

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 06.12.2010, 08:55
  2. Bilder Upload Error 500 - Internal server error
    Von Equipment im Forum Traum-Dynamik
    Antworten: 10
    Letzter Beitrag: 14.10.2008, 00:11
  3. Fremdschlüssel: Key wird nicht geprüft?
    Von Levis im Forum Traum-Dynamik
    Antworten: 12
    Letzter Beitrag: 12.06.2007, 15:23
  4. pdf error (open range check error)
    Von yum im Forum PrePress
    Antworten: 4
    Letzter Beitrag: 17.02.2005, 22:22
  5. Antworten: 2
    Letzter Beitrag: 12.06.2004, 21:33

Stichworte

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51