MySQL:错误代码 1215 无法添加外键约束。我没有重复的主键并且所有数据类型都匹配

标签 mysql sql foreign-keys constraints mysql-workbench

我是一名学生,我可能已经在这个问题上苦苦挣扎了大约几个小时,检查 MySQL 语法在线帮助、其他 stackoverflow 问题和我的教科书。我一直在反复调整我的代码,但我完全被难住了。

我一直在尝试在 MySQL 上使用正向工程功能,但在标题为“LabT3”的表上,我不断收到 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 Amber's_Clinic_ER_Diagram
-- -----------------------------------------------------
-- Lab 2
-- Amber Lewis
-- Entity-Relationship Diagram for sample Clinic

-- -----------------------------------------------------
-- Schema Amber's_Clinic_ER_Diagram
--
-- Lab 2
-- Amber Lewis
-- Entity-Relationship Diagram for sample Clinic
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Amber's_Clinic_ER_Diagram` DEFAULT CHARACTER SET utf8 ;
USE `Amber's_Clinic_ER_Diagram` ;

-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`DoctorT2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`DoctorT2` (
  `DoctorID` VARCHAR(20) NOT NULL,
  `DoctorName` VARCHAR(50) NOT NULL,
  `Dept` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`DoctorID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`PatientT1`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`PatientT1` (
  `PID` VARCHAR(5) NOT NULL,
  `Name` VARCHAR(20) NOT NULL,
  `Age` INT NULL,
  `Weight` VARCHAR(10) NULL,
  `Gender` VARCHAR(6) NOT NULL,
  `Address` VARCHAR(50) NULL,
  `PhoneNo` INT NULL,
  `Disease` VARCHAR(50) NOT NULL,
  `DoctorID` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`PID`, `DoctorID`),
  INDEX `fk_Patient - T1_Doctor - T2_idx` (`DoctorID` ASC),
  CONSTRAINT `fk_Patient - T1_Doctor - T2`
    FOREIGN KEY (`DoctorID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`DoctorT2` (`DoctorID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`OutpatientT5`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (
  `PID` VARCHAR(5) NOT NULL,
  `Date` DATE NOT NULL,
  `LabNo` INT NOT NULL,
  PRIMARY KEY (`PID`, `Date`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`RoomT6`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`RoomT6` (
  `RoomNo` INT NOT NULL,
  `RoomType` VARCHAR(15) NOT NULL,
  `Status` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`RoomNo`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`InpatientT4`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`InpatientT4` (
  `PID` VARCHAR(5) NOT NULL,
  `RoomNo` INT NOT NULL,
  `DateOfAdm` DATE NOT NULL,
  `DateOfDis` DATE NOT NULL,
  `Advance` INT NOT NULL,
  `LabNo` INT NOT NULL,
  PRIMARY KEY (`PID`, `RoomNo`, `DateOfAdm`),
  INDEX `fk_InpatientT4_RoomT61_idx` (`RoomNo` ASC),
  CONSTRAINT `fk_InpatientT4_RoomT61`
    FOREIGN KEY (`RoomNo`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`RoomT6` (`RoomNo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`LabT3`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`LabT3` (
  `LabNo` INT NOT NULL,
  `PID` VARCHAR(5) NOT NULL,
  `Weight` VARCHAR(10) NULL,
  `DoctorID` VARCHAR(20) NOT NULL,
  `Date` DATE NOT NULL,
  `Category` VARCHAR(20) NOT NULL,
  `PatientType` VARCHAR(30) NOT NULL,
  `Amount` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`LabNo`, `PID`),
  INDEX `fk_LabT3_DoctorT2_idx` (`DoctorID` ASC),
  INDEX `fk_LabT3_OutpatientT5_idx` (`PID` ASC),
  CONSTRAINT `fk_LabT3_DoctorID`
    FOREIGN KEY (`DoctorID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`DoctorT2` (`DoctorID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_LabT3_PID`
    FOREIGN KEY (`PID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (`PID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_LabT3_InpatientT41`
    FOREIGN KEY (`LabNo`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`InpatientT4` (`LabNo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`BillT7`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`BillT7` (
  `BillNo` INT NOT NULL,
  `PID` VARCHAR(5) NOT NULL,
  `PatientType` VARCHAR(30) NOT NULL,
  `DoctorCharge` INT NOT NULL,
  `MedicineCharge` INT NOT NULL,
  `RoomCharge` INT NOT NULL,
  `OperationCharge` INT NOT NULL,
  `NursingCharge` INT NOT NULL,
  `LOS` INT NOT NULL,
  `Advance` INT NOT NULL,
  `HealthCard` VARCHAR(30) NOT NULL,
  `Lab Charge` INT NOT NULL,
  `Bill` INT NOT NULL,
  PRIMARY KEY (`BillNo`, `PID`),
  INDEX `fk_BillT7_OutpatientT51_idx` (`PID` ASC),
  CONSTRAINT `fk_BillT7_OutpatientT51`
    FOREIGN KEY (`PID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (`PID`)
    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;

最佳答案

在这里,我更改了表 Lab3 和 InepticT4。

Lab3是主表,主键为LabNo,因此需要在InPatientT4中添加外键关系,并删除Lab3中的外键引用。

-- 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 Amber's_Clinic_ER_Diagram
-- -----------------------------------------------------
-- Lab 2
-- Amber Lewis
-- Entity-Relationship Diagram for sample Clinic

-- -----------------------------------------------------
-- Schema Amber's_Clinic_ER_Diagram
--
-- Lab 2
-- Amber Lewis
-- Entity-Relationship Diagram for sample Clinic
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Amber's_Clinic_ER_Diagram` DEFAULT CHARACTER SET utf8 ;
USE `Amber's_Clinic_ER_Diagram` ;

-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`DoctorT2`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`DoctorT2` (
  `DoctorID` VARCHAR(20) NOT NULL,
  `DoctorName` VARCHAR(50) NOT NULL,
  `Dept` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`DoctorID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`PatientT1`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`PatientT1` (
  `PID` VARCHAR(5) NOT NULL,
  `Name` VARCHAR(20) NOT NULL,
  `Age` INT NULL,
  `Weight` VARCHAR(10) NULL,
  `Gender` VARCHAR(6) NOT NULL,
  `Address` VARCHAR(50) NULL,
  `PhoneNo` INT NULL,
  `Disease` VARCHAR(50) NOT NULL,
  `DoctorID` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`PID`, `DoctorID`),
  INDEX `fk_Patient - T1_Doctor - T2_idx` (`DoctorID` ASC),
  CONSTRAINT `fk_Patient - T1_Doctor - T2`
    FOREIGN KEY (`DoctorID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`DoctorT2` (`DoctorID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`OutpatientT5`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (
  `PID` VARCHAR(5) NOT NULL,
  `Date` DATE NOT NULL,
  `LabNo` INT NOT NULL,
  PRIMARY KEY (`PID`, `Date`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`RoomT6`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`RoomT6` (
  `RoomNo` INT NOT NULL,
  `RoomType` VARCHAR(15) NOT NULL,
  `Status` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`RoomNo`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`LabT3`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`LabT3` (
  `LabNo` INT NOT NULL,
  `PID` VARCHAR(5) NOT NULL,
  `Weight` VARCHAR(10) NULL,
  `DoctorID` VARCHAR(20) NOT NULL,
  `Date` DATE NOT NULL,
  `Category` VARCHAR(20) NOT NULL,
  `PatientType` VARCHAR(30) NOT NULL,
  `Amount` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`LabNo`, `PID`),
  INDEX `fk_LabT3_DoctorT2_idx` (`DoctorID` ASC),
  INDEX `fk_LabT3_OutpatientT5_idx` (`PID` ASC),
  CONSTRAINT `fk_LabT3_DoctorID`
    FOREIGN KEY (`DoctorID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`DoctorT2` (`DoctorID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_LabT3_PID`
    FOREIGN KEY (`PID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (`PID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION) 
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`InpatientT4`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`InpatientT4` (
  `PID` VARCHAR(5) NOT NULL,
  `RoomNo` INT NOT NULL,
  `DateOfAdm` DATE NOT NULL,
  `DateOfDis` DATE NOT NULL,
  `Advance` INT NOT NULL,
  `LabNo` INT NOT NULL,
  PRIMARY KEY (`PID`, `RoomNo`, `DateOfAdm`),
  INDEX `fk_InpatientT4_RoomT61_idx` (`RoomNo` ASC),
  CONSTRAINT `fk_InpatientT4_RoomT61`
    FOREIGN KEY (`RoomNo`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`RoomT6` (`RoomNo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
 CONSTRAINT `fk_LabT3_InpatientT41`
    FOREIGN KEY (`LabNo`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`LabT3` (`LabNo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `Amber's_Clinic_ER_Diagram`.`BillT7`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Amber's_Clinic_ER_Diagram`.`BillT7` (
  `BillNo` INT NOT NULL,
  `PID` VARCHAR(5) NOT NULL,
  `PatientType` VARCHAR(30) NOT NULL,
  `DoctorCharge` INT NOT NULL,
  `MedicineCharge` INT NOT NULL,
  `RoomCharge` INT NOT NULL,
  `OperationCharge` INT NOT NULL,
  `NursingCharge` INT NOT NULL,
  `LOS` INT NOT NULL,
  `Advance` INT NOT NULL,
  `HealthCard` VARCHAR(30) NOT NULL,
  `Lab Charge` INT NOT NULL,
  `Bill` INT NOT NULL,
  PRIMARY KEY (`BillNo`, `PID`),
  INDEX `fk_BillT7_OutpatientT51_idx` (`PID` ASC),
  CONSTRAINT `fk_BillT7_OutpatientT51`
    FOREIGN KEY (`PID`)
    REFERENCES `Amber's_Clinic_ER_Diagram`.`OutpatientT5` (`PID`)
    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;

关于MySQL:错误代码 1215 无法添加外键约束。我没有重复的主键并且所有数据类型都匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373609/

相关文章:

java - 有什么方法可以在 JPA 或 Spring-data 中设置默认外键吗?

mysql - 数据库模式中的外键过多(冗余?)

mysql - 使用时间维度的查询忽略 "where"子句中的条件

mysql - SQL:通过子查询在一个字段中显示多个记录值

mysql - 在 MySQL 中设置外键时,ON DELETE 和 ON UPDATE 是什么意思?

sql - MS Access SQL, "function calls"

java - 服务器之间同步时间

php - 数据库设计 - "Push"模型,或写时扇出

mysql - 如何为 ASP.NET 表适配器设置 MySQL 数据库的连接字符串

php - 合并表中的行