Ошибка 1215: Невозможно добавить ограничение внешнего ключа. - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь перенаправить разработку моей схемы с MySQL Workbench, но эта ошибка появляется.Я уверен, что внешний ключ относится к первичному ключу родительской таблицы, и они оба VARCHAR (45).

Это моя схема:

-- 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='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema PiscineRoma
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema PiscineRoma
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `PiscineRoma` ;
USE `PiscineRoma` ;

-- -----------------------------------------------------
-- Table `PiscineRoma`.`Piscina`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Piscina` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Piscina` (
  `Nome` VARCHAR(45) NOT NULL,
  `NumeroDiTelefono` VARCHAR(45) NOT NULL,
  `Indirizzo` VARCHAR(45) NOT NULL,
  `NomeResponsabile` VARCHAR(45) NOT NULL,
  `DataInizioDisponibilitàVascaEsterna` DATE NULL,
  `DataFineDisponibilitàVascaEsterna` DATE NULL,
  PRIMARY KEY (`Nome`),
  UNIQUE INDEX `NumeroDiTelefono_UNIQUE` (`NumeroDiTelefono` ASC),
  UNIQUE INDEX `Indirizzo_UNIQUE` (`Indirizzo` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Persona`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Persona` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Persona` (
  `CF` VARCHAR(16) NOT NULL,
  `Nome` VARCHAR(45) NOT NULL,
  `Cognome` VARCHAR(45) NOT NULL,
  `Indirizzo` VARCHAR(45) NOT NULL,
  `Età` INT NOT NULL,
  `Telefono` VARCHAR(20) NULL,
  `Cellulare` VARCHAR(20) NULL,
  `IndirizzoEMail` VARCHAR(45) NULL,
  PRIMARY KEY (`CF`),
  UNIQUE INDEX `Telefono_UNIQUE` (`Telefono` ASC),
  UNIQUE INDEX `Cellulare_UNIQUE` (`Cellulare` ASC),
  UNIQUE INDEX `IndirizzoEMail_UNIQUE` (`IndirizzoEMail` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`IngressoSingolo`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`IngressoSingolo` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`IngressoSingolo` (
  `NomePiscina` VARCHAR(45) NOT NULL,
  `Persona_CF` VARCHAR(16) NOT NULL,
  `DataIngresso` DATETIME NOT NULL,
  PRIMARY KEY (`NomePiscina`, `Persona_CF`),
  INDEX `fk_Piscina_has_PersonaNonIscritta_Piscina_idx` (`NomePiscina` ASC),
  INDEX `fk_IngressoSingolo_Persona1_idx` (`Persona_CF` ASC),
  CONSTRAINT `fk_Piscina_has_PersonaNonIscritta_Piscina`
    FOREIGN KEY (`NomePiscina`)
    REFERENCES `PiscineRoma`.`Piscina` (`Nome`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `fk_IngressoSingolo_Persona1`
    FOREIGN KEY (`Persona_CF`)
    REFERENCES `PiscineRoma`.`Persona` (`CF`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Insegnante`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Insegnante` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Insegnante` (
  `CF` VARCHAR(16) NOT NULL,
  `Nome` VARCHAR(45) NOT NULL,
  `Cognome` VARCHAR(45) NOT NULL,
  `Telefono` VARCHAR(20) NULL,
  PRIMARY KEY (`CF`),
  UNIQUE INDEX `Telefono_UNIQUE` (`Telefono` ASC))
 ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Qualifica`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Qualifica` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Qualifica` (
  `Nome` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`Nome`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Possiede`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Possiede` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Possiede` (
  `Insegnante` VARCHAR(16) NOT NULL,
  `Qualifica` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`Insegnante`, `Qualifica`),
  INDEX `fk_Insegnante_has_Qualifica_Qualifica1_idx` (`Qualifica` ASC),
  INDEX `fk_Insegnante_has_Qualifica_Insegnante1_idx` (`Insegnante` ASC),
  CONSTRAINT `fk_Insegnante_has_Qualifica_Insegnante1`
    FOREIGN KEY (`Insegnante`)
    REFERENCES `PiscineRoma`.`Insegnante` (`CF`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Insegnante_has_Qualifica_Qualifica1`
    FOREIGN KEY (`Qualifica`)
    REFERENCES `PiscineRoma`.`Qualifica` (`Nome`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Impiego`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Impiego` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Impiego` (
  `Codice` INT NOT NULL AUTO_INCREMENT,
  `Inizio` DATE NOT NULL,
  `Fine` DATE NULL,
  `Tipo` VARCHAR(45) NOT NULL DEFAULT 'impiego_corrente',
  `NomePiscina` VARCHAR(45) NOT NULL,
  `Insegnante` VARCHAR(16) NOT NULL,
  PRIMARY KEY (`Codice`),
  INDEX `fk_Impiego_Piscina1_idx` (`NomePiscina` ASC),
  INDEX `fk_Impiego_Insegnante1_idx` (`Insegnante` ASC),
  CONSTRAINT `fk_Impiego_Piscina1`
    FOREIGN KEY (`NomePiscina`)
    REFERENCES `PiscineRoma`.`Piscina` (`Nome`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Impiego_Insegnante1`
    FOREIGN KEY (`Insegnante`)
    REFERENCES `PiscineRoma`.`Insegnante` (`CF`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Corso`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Corso` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Corso` (
  `NomeAttivita` VARCHAR(45) NOT NULL,
  `NomePiscina` VARCHAR(45) NOT NULL,
  `Costo` SMALLINT(2) NOT NULL,
  `NumeroMinimoDiPartecipanti` SMALLINT(2) NOT NULL,
  `NumeroMassimoDiPartecipanti` SMALLINT(2) NOT NULL,
  PRIMARY KEY (`NomeAttivita`, `NomePiscina`),
  INDEX `fk_Corso_Piscina1_idx` (`NomePiscina` ASC),
  CONSTRAINT `fk_Corso_Piscina1`
    FOREIGN KEY (`NomePiscina`)
    REFERENCES `PiscineRoma`.`Piscina` (`Nome`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB
PACK_KEYS = DEFAULT
ROW_FORMAT = DEFAULT;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Lezione`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Lezione` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Lezione` (
  `Codice` INT NOT NULL AUTO_INCREMENT,
  `NomeAttivitaCorso` VARCHAR(45) NOT NULL,
  `NomePiscina` VARCHAR(45) NOT NULL,
  `Insegnante` VARCHAR(16) NOT NULL,
  `Dat` DATETIME NOT NULL,
  `Numero` INT NOT NULL,
  PRIMARY KEY (`Codice`),
  INDEX `fk_Lezione_Insegnante1_idx` (`Insegnante` ASC),
  CONSTRAINT `fk_Lezione_Corso1`
    FOREIGN KEY (`NomeAttivitaCorso` , `NomePiscina`)
    REFERENCES `PiscineRoma`.`Corso` (`NomeAttivita` , `NomePiscina`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
    CONSTRAINT `fk_Lezione_Insegnante1`
    FOREIGN KEY (`Insegnante`)
    REFERENCES `PiscineRoma`.`Insegnante` (`CF`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `PiscineRoma`.`Iscrizione`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `PiscineRoma`.`Iscrizione` ;

CREATE TABLE IF NOT EXISTS `PiscineRoma`.`Iscrizione` (
  `Codice` INT NOT NULL AUTO_INCREMENT,
  `DataIscrizione` DATE NOT NULL,
  `CodiceCertificato` INT NULL,
  `DataCertificato` DATE NULL,
  `Medico` VARCHAR(45) NULL,
  `NomeAttivitaCorso` VARCHAR(45) NOT NULL,
  `NomePiscina` VARCHAR(45) NOT NULL,
  `PersonaIscritta` VARCHAR(16) NOT NULL,
  PRIMARY KEY (`Codice`),
  INDEX `fk_Iscrizione_Corso1_idx` (`NomeAttivitaCorso` ASC, `NomePiscina` ASC),
  INDEX `fk_Iscrizione_PersonaIscritta1_idx` (`PersonaIscritta` ASC),
  UNIQUE INDEX `CodiceCertificato_UNIQUE` (`CodiceCertificato` ASC),
  CONSTRAINT `fk_Iscrizione_Corso1`
    FOREIGN KEY (`NomeAttivitaCorso` , `NomePiscina`)
    REFERENCES `PiscineRoma`.`Corso` (`NomeAttivita` , `NomePiscina`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Iscrizione_PersonaIscritta1`
    FOREIGN KEY (`PersonaIscritta`)
    REFERENCES `PiscineRoma`.`Persona` (`CF`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB;

USE `PiscineRoma` ;

Журнал сообщений отMySQL Workbench сообщает, что ошибка в PiscineRoma.Corso.

Я также попытался запустить команду SHOW ENGINE INNODB STATUS и под меткой ошибка:

2019-02-14 19:52:03 0x7f9fa9700700 Ошибка в ограничении внешнего ключа таблицы PiscineRoma / Iscrizione: в ссылочной таблице нет индекса, который бы содержал столбцы в качестве первых столбцов, или типы данных в ссылочной таблице не совпадают с типами данных в таблице,Ограничение:, CONSTRAINT `fk_Iscrizione_Corso1` ИНОСТРАННЫЙ КЛЮЧ (` NomeAttivita`, `NomePiscina`) ЛИТЕРАТУРА` Corso` (`NomeAttività`,` NomePiscina`) НА УДАЛИТЬ НЕТ ДЕЙСТВИЯ НА ОБНОВЛЕНИИ КЛЮЧЕЙна http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html для правильного определения внешнего ключа.

Спасибо всем за ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...