【问题标题】:EER diagram forward engineering error: mysql ERROR: Error 1215: Cannot add foreign key constraintEER图正向工程错误:mysql ERROR:错误1215:无法添加外键约束
【发布时间】:2018-08-27 05:46:05
【问题描述】:

我正在使用 MySQL 工作台使用 EER 图创建数据库结构。完成后,我使用正向工程功能创建了我的模型的 sql 文件:EER Diagram

当我尝试在 MySQL 服务器上部署此查询时,它一直给我 mysql 错误:错误 1215:无法添加外键约束。

有人可以帮帮我吗?

    -- 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`.`TblPersoon`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblPersoon` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblPersoon` (
  `PersoonID` INT NOT NULL,
  `GSM` VARCHAR(45) NULL,
  `Functie` VARCHAR(45) NULL,
  `Voornaam` VARCHAR(45) NULL,
  `Achternaam` VARCHAR(45) NULL,
  PRIMARY KEY (`PersoonID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`TblDevice`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblDevice` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblDevice` (
  `DeviceID` INT NOT NULL,
  `Van` VARCHAR(45) NULL,
  `Tot` VARCHAR(45) NULL,
  PRIMARY KEY (`DeviceID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`TblEvents`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblEvents` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblEvents` (
  `EventID` INT NOT NULL AUTO_INCREMENT,
  `Naam` VARCHAR(45) NULL,
  `Locatie` VARCHAR(45) NULL,
  `ContactpersoonID` INT NOT NULL,
  `VerantwoordelijkeID` INT NOT NULL,
  `EventNaam` VARCHAR(45) NULL,
  PRIMARY KEY (`EventID`),
  INDEX `PersoonID_idx` (`ContactpersoonID` ASC),
  INDEX `PersoonID_idx1` (`VerantwoordelijkeID` ASC),
  CONSTRAINT `PersoonID`
    FOREIGN KEY (`ContactpersoonID`)
    REFERENCES `mydb`.`TblPersoon` (`PersoonID`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `PersoonID`
    FOREIGN KEY (`VerantwoordelijkeID`)
    REFERENCES `mydb`.`TblPersoon` (`PersoonID`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`TblContainer`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblContainer` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblContainer` (
  `ContainerID` INT NULL,
  `Plaats` INT NULL,
  PRIMARY KEY (`ContainerID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`TblInstallatie`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblInstallatie` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblInstallatie` (
  `InstallatieID` INT NULL,
  `ContainerID` INT NULL,
  `DeviceID` INT NULL,
  `Van` VARCHAR(45) NULL,
  `Tot` VARCHAR(45) NULL,
  `EventID` INT NULL,
  `Omschrijving` VARCHAR(45) NULL,
  `VerantwoordelijkeID` INT NULL,
  PRIMARY KEY (`InstallatieID`),
  INDEX `PersoonID_idx` (`VerantwoordelijkeID` ASC),
  INDEX `DeviceID_idx` (`DeviceID` ASC),
  INDEX `EventID_idx` (`EventID` ASC),
  INDEX `ContainerID_idx` (`ContainerID` ASC),
  CONSTRAINT `PersoonID`
    FOREIGN KEY (`VerantwoordelijkeID`)
    REFERENCES `mydb`.`TblPersoon` (`PersoonID`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `DeviceID`
    FOREIGN KEY (`DeviceID`)
    REFERENCES `mydb`.`TblDevice` (`DeviceID`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `EventID`
    FOREIGN KEY (`EventID`)
    REFERENCES `mydb`.`TblEvents` (`EventID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `ContainerID`
    FOREIGN KEY (`ContainerID`)
    REFERENCES `mydb`.`TblContainer` (`ContainerID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`TblLog`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`TblLog` ;

CREATE TABLE IF NOT EXISTS `mydb`.`TblLog` (
  `LogID` INT NOT NULL,
  `InstallatieID` INT NULL,
  PRIMARY KEY (`LogID`),
  INDEX `InstallatieID_idx` (`InstallatieID` ASC),
  CONSTRAINT `InstallatieID`
    FOREIGN KEY (`InstallatieID`)
    REFERENCES `mydb`.`TblInstallatie` (`InstallatieID`)
    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;

【问题讨论】:

  • 帖子已更新
  • 您正在引用表TblPersoon。它存在吗?
  • 我会上传整个sql,TblPerson作为第一个表创建

标签: mysql sql key constraints


【解决方案1】:

我注意到TblEvents 中的两个外键约束具有相同的名称PersoonID。约束名称必须是唯一的,实际上它们在整个架构中必须是唯一的,而不仅仅是在定义它们的表中。

TblInstallatie 也有自己的约束,名为 PersoonID。因此,如果您只是更改TblEvents 中的约束名称之一,当您到达CREATE TABLE TblInstallatie 时仍然会导致错误。

我使用 MySQL 5.6 对此进行了测试,并通过为 TblEvents 中的两个约束赋予不同的名称来使其工作。

CREATE TABLE IF NOT EXISTS `mydb`.`TblEvents` (
  ...
  CONSTRAINT `PersoonID1`
    FOREIGN KEY (`ContactpersoonID`)
    ...
  CONSTRAINT `PersoonID2`
    FOREIGN KEY (`VerantwoordelijkeID`)
    ...

之后TblInstallatieCONSTRAINT PersoonID的创建就可以成功了。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2016-09-25
    • 2021-09-24
    • 2014-03-25
    • 2014-09-15
    • 2013-06-02
    • 2018-04-28
    相关资源
    最近更新 更多