创建多对多关系时出现mysql错误#1215

qyzbxkaa  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(247)

我试图在两个表“master”和“options”之间创建一个简单的多对多关系。在尝试使用phpmyadmin导入时,我不断得到“#1215-无法添加外键约束”。我不知道我的代码和想法有什么问题?仅供参考,我可以创建一对多的关系只是罚款,但不是一个多对多。

-- 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;
cfh9epnr

cfh9epnr1#

出现错误是因为您没有在引用的列上定义索引。
从文档中
mysql需要外键和引用键的索引,这样外键检查可以很快,并且不需要表扫描。

innodb允许外键引用任何列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同顺序列为第一列。
没有为定义索引 Options 中的列 Master 或者 Options table。这将导致您得到的错误。
也,
此外,出于性能原因,mysql要求对引用的列进行索引。但是,系统不强制要求引用的列是唯一的或声明为非null。对于诸如update或delete cascade之类的操作,没有很好地定义对非唯一键或包含空值的键的外键引用的处理。建议您使用只引用唯一键(包括主键)而不引用空键的外键。
两者 Options 列允许null,并且您没有将它们定义为唯一的。这不会阻止您创建fks,但可能意味着当您创建fks时,它们将不会如您所期望的那样工作。

相关问题