MySQL Workbench - error 1215

0

Mam następujący błąd związany z kluczem obcym przez co nie mogę eksportować modelu do pliku mysql:

 
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
        -- -----------------------------------------------------
        -- Table `mydb`.`Zamowienie`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `mydb`.`Zamowienie` (
          `idZamowienie` INT NOT NULL,
          `dataZlozenia` DATE NOT NULL,
          `dataRealizacji` DATE NULL,
          `status` ENUM('przyjeto', 'w trakcie realizacji', 'zrealizowano') NOT NULL,
          `dodatkowyOpis` VARCHAR(45) NULL,
          `nrFaktury` VARCHAR(45) NULL,
          `rabatZaPunkty` VARCHAR(45) NULL,
          `Klient_idKlient` INT NOT NULL,
          `Klient_Karta_idKarta` INT NULL,
          `Pracownik_idPracownik` INT NOT NULL,
          PRIMARY KEY (`idZamowienie`),
          INDEX `fk_Zamowienie_Klient1_idx` (`Klient_idKlient` ASC, `Klient_Karta_idKarta` ASC),
          INDEX `fk_Zamowienie_Pracownik1_idx` (`Pracownik_idPracownik` ASC),
          CONSTRAINT `fk_Zamowienie_Klient1`
            FOREIGN KEY (`Klient_idKlient` , `Klient_Karta_idKarta`)
            REFERENCES `mydb`.`Klient` (`idKlient` , `Karta_idKarta`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_Zamowienie_Pracownik1`
            FOREIGN KEY (`Pracownik_idPracownik`)
            REFERENCES `mydb`.`Pracownik` (`idPracownik`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB

SQL script execution finished: statements: 9 succeeded, 1 failed

Tabela Klient:


-- -----------------------------------------------------
-- Table `mydb`.`Klient`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Klient` (
  `idKlient` INT NOT NULL,
  `nazwisko` VARCHAR(45) NOT NULL,
  `imie` VARCHAR(20) NOT NULL,
  `e-mail` VARCHAR(30) NOT NULL,
  `newsletter` TINYINT(1) NOT NULL,
  `telefon` VARCHAR(15) NOT NULL,
  `zarejestrowany` TINYINT(1) NOT NULL,
  `login` VARCHAR(45) NULL,
  `haslo` VARCHAR(45) NULL,
  `Karta_idKarta` INT NULL,
  `Adres_idAdres` INT NOT NULL,
  PRIMARY KEY (`idKlient`),
  INDEX `fk_Klient_Karta_idx` (`Karta_idKarta` ASC),
  INDEX `fk_Klient_Adres1_idx` (`Adres_idAdres` ASC),
  CONSTRAINT `fk_Klient_Karta`
    FOREIGN KEY (`Karta_idKarta`)
    REFERENCES `mydb`.`Karta` (`idKarta`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Klient_Adres1`
    FOREIGN KEY (`Adres_idAdres`)
    REFERENCES `mydb`.`Adres` (`idAdres`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

Tabela pracownik:

-- -----------------------------------------------------
-- Table `mydb`.`Pracownik`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Pracownik` (
  `idPracownik` INT NOT NULL,
  `pesel` INT NOT NULL,
  `stanowisko` ENUM('sprzedawca', 'magazynier') NOT NULL,
  `nazwisko` VARCHAR(45) NOT NULL,
  `imie` VARCHAR(20) NOT NULL,
  `adres` VARCHAR(45) NOT NULL,
  `Adres_idAdres` INT NOT NULL,
  PRIMARY KEY (`idPracownik`),
  INDEX `fk_Pracownik_Adres1_idx` (`Adres_idAdres` ASC),
  CONSTRAINT `fk_Pracownik_Adres1`
    FOREIGN KEY (`Adres_idAdres`)
    REFERENCES `mydb`.`Adres` (`idAdres`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

Typy się zgadzają więc dlaczego nie działa?

0

Uruchom sobie zapytanie:

SHOW ENGINE INNODB STATUS

W wyniku zapytania w kolumnie Status sprawdź sekcję LATEST FOREIGN KEY ERROR - tam będzie informacja dlaczego nie udało się utworzyć klucza obcego.

W Twoim przypadku w tabeli Klient nie istnieje indeks na kolumny, które występują w kluczu obcym, czyli FOREIGN KEY (Klient_idKlient, Klient_Karta_idKarta).
Aby dało się utworzyć tabelę Zamowienie w tabeli Klient trzeba utworzyć indeks na kolumny idKlient, Karta_idKarta.

Zastanawia mnie jednak jeszcze dlaczego łączysz tabelę Klient z Zamowienie po idKlient i po Karta_idKarta - wydaje mi się, że poprawne jest połączenie tylko po idKlient.

[Adam]

1 użytkowników online, w tym zalogowanych: 0, gości: 1