我试图在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;
答案 0 :(得分:0)
您收到错误是因为您没有在引用的列上定义索引。
MySQL要求外键和引用键上的索引 外键检查可以很快,不需要进行表扫描。
和
InnoDB允许外键引用任何列或组 列。但是,在引用的表中,必须有一个索引 其中引用的列被列为的第一列 同样的顺序。
在Options
或Master
表中没有为Options
列定义索引。这将导致您获得的错误。
此外,
此外,MySQL要求对引用的列进行索引 出于性能原因。但是,系统不强制执行 要求引用的列为UNIQUE或声明为NOT 空值。处理对非唯一键或键的外键引用 对于诸如的操作,没有很好地定义包含NULL值的值 更新或删除CASCADE。建议您使用外键 仅引用UNIQUE(包括PRIMARY)和NOT NULL键。
两个Options
列都允许NULL,并且您没有将它们定义为UNIQUE。这不会阻止你创建FK,但可能意味着当你这样做时它们将无法按预期工作。