关于多对多关系创建的MySQL错误#1215

时间:2018-04-16 22:01:14

标签: mysql

我试图在2个表之间创建一个简单的多对多关系," master"和"选项"。我继续得到"#1215 - 无法添加外键约束"尝试使用phpMyAdmin导入时。我无法弄清楚我的代码,想法有什么问题?仅供参考,我可以创建一对多关系,但不是很多。

-- MySQL Script generated by MySQL Workbench
-- Mon Apr 16 14:44:57 2018
-- 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`.`Master`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Master` (
  `Master_ID` INT NOT NULL AUTO_INCREMENT,
  `Options` INT NULL,
  PRIMARY KEY (`Master_ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Options`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Options` (
  `Options_ID` INT NOT NULL AUTO_INCREMENT,
  `Options` VARCHAR(45) NULL,
  PRIMARY KEY (`Options_ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Master_Options`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Master_Options` (
  `Master_ID` INT NULL,
  `Options_ID` INT NULL,
  INDEX `fk_Master_Options_Master_idx` (`Master_ID` ASC),
  INDEX `fk_Master_Options_Options1_idx` (`Options_ID` ASC),
  CONSTRAINT `fk_Master_Options_Master`
    FOREIGN KEY (`Master_ID`)
    REFERENCES `mydb`.`Master` (`Options`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_Master_Options_Options1`
    FOREIGN KEY (`Options_ID`)
    REFERENCES `mydb`.`Options` (`Options_ID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

1 个答案:

答案 0 :(得分:0)

您收到错误是因为您没有在引用的列上定义索引。

来自documentation

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要进行表扫描。

  

InnoDB允许外键引用任何列或组   列。但是,在引用的表中,必须有一个索引   其中引用的列被列为的第一列   同样的顺序。

OptionsMaster表中没有为Options列定义索引。这将导致您获得的错误。

此外,

  

此外,MySQL要求对引用的列进行索引   出于性能原因。但是,系统不强制执行   要求引用的列为UNIQUE或声明为NOT   空值。处理对非唯一键或键的外键引用   对于诸如的操作,没有很好地定义包含NULL值的值   更新或删除CASCADE。建议您使用外键   仅引用UNIQUE(包括PRIMARY)和NOT NULL键。

两个Options列都允许NULL,并且您没有将它们定义为UNIQUE。这不会阻止你创建FK,但可能意味着当你这样做时它们将无法按预期工作。