Error Code: 1215. Cannot add foreign key constraint

0

Witam,
Pracuję w workbenchu, stworzyłem sobie model i wygenerowałem z niego skrypt SQL. Następnie skrypt wczytałem.

 -- MySQL Script generated by MySQL Workbench
-- 07/09/16 00:43:14
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`Przedmioty`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Przedmioty` (
  `id` INT(10) NOT NULL,
  `nazwa` TEXT NULL,
  `cena` INT NULL,
  `ida` INT(10) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Atrybuty`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Atrybuty` (
  `ida` INT(10) NOT NULL,
  `atak` INT NULL,
  `szybkosc` INT NULL,
  PRIMARY KEY (`ida`),
  CONSTRAINT `fk_Atrybuty_Przedmioty`
    FOREIGN KEY (`ida`)
    REFERENCES `mydb`.`Przedmioty` (`ida`)
    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;

Gdy próbuję go wygenerować pojawia się błąd: Error Code: 1215. Cannot add foreign key constraint
Szukałem po Stacku ale tego nie rozumiem wciąż. Wszystko porobiłem między relacjami na INT(10) bądź INT
Całość krzyczy na : FOREIGN KEY (ida) REFERENCES mydb.Przedmioty (ida), ale tego nie chce usuwac gdyż strace relacje.
Relacja polega na tym iż: 1 x przedmiot ma Wiele x atrybutów. ( może i to nie ma sensu większego, ale uczę się na błędach).
Jak sobie z tym poradzić?

Z góry dziękuję za wszelaką pomoc.

1

Teoretycznie wystarczyłoby, abyś założył indeks na kolumnę Przedmioty.ida- tyle że wtedy będziesz miał nieznormalizowaną bazę... i generalnie coś podejrzanie to wygląda.

Usuń kolumnę Przedmioty.ida oraz usuń relację fk_Atrybuty_Przedmioty, następnie utwórz słownikową tabelę Przedmioty_Atrybuty z kolumnami id_przedmiotu oraz id_atrybutu - ona będzie łącznikiem między przedmiotami oraz atrybutami, dzięki czemu będziesz miał jasne połączenie co z czym.

Plus żyjemy w XXI wieku - nie musisz oszczędzać na identyfikatorach. Najlepiej przynajmniej indeksy nazywaj w miarę pełnie, np. nie Przedmioty.id, tylko Przedmioty.id_przedmiotu oraz nie Atrybuty.ida tylko Atrybuty.id_atrybutu. Dzięki temu w zapytaniach podczas joinów będziesz mógł wykorzystać klauzulę USING.

1

FK powinien być w drugą stronę

0
abrakadaber napisał(a):

FK powinien być w drugą stronę

zmiana na -> https://scr.hu/2pdc/3wenp
efekt:
http://scr.hu/2pdc/4qitc
"Coś sie coś sie zepsuło"... Jak widać na screenie całość się załadowala bez błędu. Dlaczego nie można dać w drugą stronę?
Różnica jest w primary key. Wcześniej: 1 x id nazwa mogło mieć wiele primaryKey(nie działało), a teraz 1 x primaryKey może mieć wiele nazw.

Dlaczego pole w Atrybuty.id nazwa nie może mieć wiele primary keyów? Może dla Cb to proste, ale prosze wytłumaczyć łapotologicznie. I nawet nie chodzi mi o to że to może nie miało by sensu w praktyce bo istnieją zasoby Abstrakcyjne jak: klasy abstrakcyjne, tabele multiWymiarowe(w realu mamy do 3d), czy fakt ze komputer nie ma problemy dzielenia przez zero, które to rzeczy się kompilują. Czy jest jakaś złota zasada że w relacji 1 do Wielu, primary Key nie może być tą mnogością? Z góry dzięki !

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