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

问题描述 投票:0回答:1

我正在尝试在2个表,“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;
mysql
1个回答
0
投票

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

来自documentation

MySQL需要外键和引用键的索引,以便外键检查可以快速,不需要表扫描。

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

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

也,

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

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

© www.soinside.com 2019 - 2024. All rights reserved.