Erno 150 wenn Attribut kein Primary Key

Vertax

Benutzer
Beiträge
10
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


Uploaded with ImageShack.us
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 

thomas_w

SQL-Guru
Beiträge
104
AW: Erno 150 wenn Attribut kein Primary Key

ERROR: Error 1005: Can't create table 'mydb.reservierungen' (errno: 150)

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
 

Vertax

Benutzer
Beiträge
10
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
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 
Oben