1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Erno 150 wenn Attribut kein Primary Key

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Vertax, 15 Dezember 2010.

  1. Vertax

    Vertax Benutzer

    Hallo Community,
    ich habe ein komisches Problem was ich nicht wirklich verstehe:

    Also ich möchte eine Datenbank modellieren für ein Hotelmanagementsystem. Dies ist meine Modelierung:

    Code:
    CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
    USE `mydb` ;
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Hotelkette`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Hotelkette` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Hotelkette` (
      `Hotelketten-Nr` INT NOT NULL AUTO_INCREMENT ,
      `Hotelkette` VARCHAR(45) NULL ,
      PRIMARY KEY (`Hotelketten-Nr`) )
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Zahlungsarten`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Zahlungsarten` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Zahlungsarten` (
      `Zahlungsnummer` INT NOT NULL ,
      `Rechnung` TINYINT(1)  NULL ,
      `Lastschrift` TINYINT(1)  NULL ,
      `Barzahlung` TINYINT(1)  NULL ,
      `Kreditkarte` TINYINT(1)  NULL ,
      PRIMARY KEY (`Zahlungsnummer`) )
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Hotel`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Hotel` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Hotel` (
      `Hotel-Nr` INT NOT NULL AUTO_INCREMENT ,
      `HotelName` VARCHAR(45) NULL ,
      `Ort` VARCHAR(45) NULL ,
      `PLZ` VARCHAR(10) NULL ,
      `Strasse` VARCHAR(45) NULL ,
      `Telefon` INT NULL ,
      `Hotelart` VARCHAR(45) NULL ,
      `Hotellage` VARCHAR(45) NULL ,
      `Hotelkategorie` ENUM('1','2','3','4','5') NOT NULL ,
      `Email` VARCHAR(45) NULL ,
      `Hotelketten-Nr` INT NULL DEFAULT NULL ,
      `Zahlungsarten` INT NOT NULL ,
      PRIMARY KEY (`Hotel-Nr`) ,
      INDEX `fk_Hotel_Hotelkette1` (`Hotelketten-Nr` ASC) ,
      INDEX `fk_Hotel_Zahlungsarten1` (`Zahlungsarten` ASC) ,
      CONSTRAINT `fk_Hotel_Hotelkette1`
        FOREIGN KEY (`Hotelketten-Nr` )
        REFERENCES `mydb`.`Hotelkette` (`Hotelketten-Nr` )
        ON DELETE SET NULL
        ON UPDATE CASCADE,
      CONSTRAINT `fk_Hotel_Zahlungsarten1`
        FOREIGN KEY (`Zahlungsarten` )
        REFERENCES `mydb`.`Zahlungsarten` (`Zahlungsnummer` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Hotelinformation`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Hotelinformation` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Hotelinformation` (
      `Hotel-Nr` INT NOT NULL ,
      `Beschreibung` LONGTEXT NULL ,
      `Frühster CheckIn` TIME NULL ,
      `Spätester CheckOut` TIME NULL ,
      `Rezeption` VARCHAR(45) NULL ,
      PRIMARY KEY (`Hotel-Nr`) ,
      CONSTRAINT `fk_Hotelinformation_Hotel1`
        FOREIGN KEY (`Hotel-Nr` )
        REFERENCES `mydb`.`Hotel` (`Hotel-Nr` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Zimmertyp`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Zimmertyp` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Zimmertyp` (
      `Hotel-Nr` INT NOT NULL ,
      `Beschreibung` VARCHAR(45) NOT NULL ,
      `Preis` VARCHAR(45) NULL ,
      PRIMARY KEY (`Hotel-Nr`, `Beschreibung`) ,
      INDEX `fk_Zimmertyp_Hotel1` (`Hotel-Nr` ASC) ,
      CONSTRAINT `fk_Zimmertyp_Hotel1`
        FOREIGN KEY (`Hotel-Nr` )
        REFERENCES `mydb`.`Hotel` (`Hotel-Nr` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Zimmer`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Zimmer` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Zimmer` (
      `HotelNr` INT NOT NULL ,
      `Zimmer-Nr` INT NOT NULL ,
      `Zimmertyp` VARCHAR(45) NOT NULL ,
      `Zimmerlage` VARCHAR(45) NULL ,
      `Belegt` VARCHAR(45) NULL ,
      `Doppelzimmer` TINYINT(1)  NOT NULL ,
      PRIMARY KEY (`HotelNr`, `Zimmer-Nr`) ,
      INDEX `fk_Zimmer_Zimmertyp1` (`HotelNr` ASC, `Zimmertyp` ASC) ,
      CONSTRAINT `fk_Zimmer_Zimmertyp1`
        FOREIGN KEY (`HotelNr` , `Zimmertyp` )
        REFERENCES `mydb`.`Zimmertyp` (`Hotel-Nr` , `Beschreibung` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Zimmerausstattung`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Zimmerausstattung` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Zimmerausstattung` (
      `Hotel-Nr` INT NOT NULL ,
      `Zimmertyp` VARCHAR(45) NOT NULL ,
      `Dusche` TINYINT(1)  NOT NULL ,
      `TV` TINYINT(1)  NOT NULL ,
      `Badezimmer` TINYINT(1)  NOT NULL ,
      `Lärmschutzfenster` TINYINT(1)  NOT NULL ,
      `Haartrockner` TINYINT(1)  NOT NULL ,
      `Nichtraucher` TINYINT(1)  NOT NULL ,
      `Telefon` TINYINT(1)  NOT NULL ,
      `DSL` TINYINT(1)  NOT NULL ,
      `WLan` TINYINT(1)  NOT NULL ,
      PRIMARY KEY (`Hotel-Nr`, `Zimmertyp`) ,
      CONSTRAINT `fk_Zimmerausstattung_Zimmertyp1`
        FOREIGN KEY (`Hotel-Nr` , `Zimmertyp` )
        REFERENCES `mydb`.`Zimmertyp` (`Hotel-Nr` , `Beschreibung` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Hotelausstattung`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Hotelausstattung` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Hotelausstattung` (
      `Hotel-Nr` INT NOT NULL ,
      `Fahrstuhl` INT NULL ,
      `PArkplatz` VARCHAR(45) NULL ,
      `Fitnessraum` VARCHAR(45) NULL ,
      `Hotelbar` VARCHAR(45) NULL ,
      `Klimaanlage` VARCHAR(45) NULL ,
      `Restaurant` VARCHAR(45) NULL ,
      PRIMARY KEY (`Hotel-Nr`) ,
      CONSTRAINT `fk_Hotelausstattung_Hotel1`
        FOREIGN KEY (`Hotel-Nr` )
        REFERENCES `mydb`.`Hotel` (`Hotel-Nr` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Kunde`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Kunde` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Kunde` (
      `Kunden-Nr` INT NOT NULL AUTO_INCREMENT ,
      `Name` VARCHAR(45) NULL ,
      `Vorname` VARCHAR(45) NULL ,
      `Adresse` VARCHAR(45) NULL ,
      `PLZ` VARCHAR(45) NULL ,
      `Ort` VARCHAR(45) NULL ,
      `Telefonnnumer` VARCHAR(45) NULL ,
      `Email` VARCHAR(45) NULL ,
      PRIMARY KEY (`Kunden-Nr`) )
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Reservierungen`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Reservierungen` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Reservierungen` (
      `Reservierungs-Nr` INT NOT NULL ,
      `Anreise` VARCHAR(45) NULL ,
      `Abreise` VARCHAR(45) NULL ,
      `Personen Anzahl` VARCHAR(45) NULL ,
      `Gesamtpreis` VARCHAR(45) NULL ,
      `Verpflegung` VARCHAR(45) NULL ,
      `Reservierungsdatum` VARCHAR(45) NULL ,
      `Zimmer_HotelNr` INT NOT NULL ,
      `Zimmer_Zimmer-Nr` INT NOT NULL ,
      `Zimmertyp` VARCHAR(45) NOT NULL ,
      PRIMARY KEY (`Reservierungs-Nr`) ,
      INDEX `fk_Reservierungen_Zimmer1` (`Zimmer_HotelNr` ASC, `Zimmer_Zimmer-Nr` ASC, `Zimmertyp` ASC) ,
      CONSTRAINT `fk_Reservierungen_Zimmer1`
        FOREIGN KEY (`Zimmer_HotelNr` , `Zimmer_Zimmer-Nr` , `Zimmertyp` )
        REFERENCES `mydb`.`Zimmer` (`HotelNr` , `Zimmer-Nr` , `Zimmertyp` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Kunde_has_Reservierungen`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Kunde_has_Reservierungen` ;
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Kunde_has_Reservierungen` (
      `Kunde_Kunden-Nr` INT NOT NULL ,
      `Reservierungen_Reservierungs-Nr` INT NOT NULL ,
      PRIMARY KEY (`Kunde_Kunden-Nr`, `Reservierungen_Reservierungs-Nr`) ,
      INDEX `fk_Kunde_has_Reservierungen_Reservierungen1` (`Reservierungen_Reservierungs-Nr` ASC) ,
      CONSTRAINT `fk_Kunde_has_Reservierungen_Kunde1`
        FOREIGN KEY (`Kunde_Kunden-Nr` )
        REFERENCES `mydb`.`Kunde` (`Kunden-Nr` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_Kunde_has_Reservierungen_Reservierungen1`
        FOREIGN KEY (`Reservierungen_Reservierungs-Nr` )
        REFERENCES `mydb`.`Reservierungen` (`Reservierungs-Nr` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    
    Jetzt bekomme ich aber den folgenden Fehler:

    Code:
    Executing SQL script in server
    
    ERROR: Error 1005: Can't create table 'mydb.reservierungen' (errno: 150)
    
    
    CREATE  TABLE IF NOT EXISTS `mydb`.`Reservierungen` (
      `Reservierungs-Nr` INT NOT NULL ,
      `Anreise` VARCHAR(45) NULL ,
      `Abreise` VARCHAR(45) NULL ,
      `Personen Anzahl` VARCHAR(45) NULL ,
      `Gesamtpreis` VARCHAR(45) NULL ,
      `Verpflegung` VARCHAR(45) NULL ,
      `Reservierungsdatum` VARCHAR(45) NULL ,
      `Zimmer_HotelNr` INT NOT NULL ,
      `Zimmer_Zimmer-Nr` INT NOT NULL ,
      `Zimmertyp` VARCHAR(45) NOT NULL ,
      PRIMARY KEY (`Reservierungs-Nr`) ,
    
      INDEX `fk_Reservierungen_Zimmer1` (`Zimmer_HotelNr` ASC, `Zimmer_Zimmer-Nr` ASC, `Zimmertyp` ASC) ,
      CONSTRAINT `fk_Reservierungen_Zimmer1`
    
        FOREIGN KEY (`Zimmer_HotelNr` , `Zimmer_Zimmer-Nr` , `Zimmertyp` )
        REFERENCES `mydb`.`Zimmer` (`HotelNr` , `Zimmer-Nr` , `Zimmertyp` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    
    SQL script execution finished: statements: 25 succeeded, 1 failed
    
    Wenn nun allerdings in der Entität Zimmer das Attribut Zimmertyp auch ein Primary Key ist, funktioniert alles. Das möchte ich aber eigentlich nicht da dies einfach nicht bestandteil des Zimmertyps ist.

    Weis einer wieso der Fehler auftritt?

    Ich poste nochmal mein ERM-Model
    [​IMG]

    Uploaded with ImageShack.us
     
  2. Charly

    Charly Datenbank-Guru

    AW: Erno 150 wenn Attribut kein Primary Key

    Hallo,

    ganz einfach: Wenn du mit einer Foreign Key-Einschränkung auf eine Tabelle verweist muss die Spalte oder die Kombination aus Spalten auf die du verweist, eindeutig sein.

    Wenn also eine Spalte der zu referenzierenden Tabelle nicht im PK ist verweigert das System die Erstellung der Einschränkung.

    Gruß Charly
     
  3. thomas_w

    thomas_w Datenbank-Guru

    AW: Erno 150 wenn Attribut kein Primary Key

    Richtig, wie @Charly schon erklärt hat, stimmen die Fremdschlüsselbeziehungen nicht überein.

    Code:
    Please check you FOREIGN KEY Constrainst. 
    => MySQL error code 150: Foreign key constraint is incorrectly formed 
    
    Grüße
    Thomas
     
  4. Vertax

    Vertax Benutzer

    AW: Erno 150 wenn Attribut kein Primary Key

    Danke schön für die Antwort,
    wie könnte ich den das ganze Umgehn?
    Bzw einen anderen Ansatz verfolgen
     
  5. Charly

    Charly Datenbank-Guru

    AW: Erno 150 wenn Attribut kein Primary Key

    Hallo Vertax,

    einen möglichen Ansatz könnte ich mir so vorstellen.

    Code:
     
    CREATE  TABLE Hotel 
    (
      HotelNr INT PRIMARY KEY,
    )
    CREATE TABLE ZimmerTyp
    (
     TypNr INT PRIMARY KEY,
     Bezeichnung VARCHAR(100)
    )
    CREATE  TABLE Zimmer 
    (
      ZimmerNr INT PRIMARY KEY 
    )
    CREATE TABLE Zimmer_typ_Hotel 
    (
      HotelNr INT NOT NULL ,
      ZimmerNr INT NOT NULL ,
      TypNr INT NOT NULL,
      PRIMARY KEY (HotelNr, ZimmerNr) ,
      CONSTRAINT fk_Hotel FOREIGN KEY (HotelNr) REFERENCES Hotel (HotelNr),
      CONSTRAINT fk_Zimmer FOREIGN KEY (ZimmerNr) REFERENCES Zimmer (ZimmerNr),
      CONSTRAINT fk_Typ FOREIGN KEY (TypNr) REFERENCES ZimmerTyp (TypNr)
    )
    CREATE  TABLE Reservierungen 
    (
      ReservierungsNr INT PRIMARY KEY,
      HotelNr INT NOT NULL ,
      ZimmerNr INT NOT NULL ,
      CONSTRAINT fk_Res FOREIGN KEY (HotelNr , ZimmerNr) REFERENCES Zimmer_typ_Hotel (HotelNr , ZimmerNr)
    )
    
    ich habe das Schema stark vereinfacht und alle nicht beteiligten Spalten und Tabellen weggelassen.

    Ist nur ein Vorschlag.

    Gruß Charly
     
Die Seite wird geladen...

Diese Seite empfehlen