我试图在两个表“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;
1条答案
按热度按时间cfh9epnr1#
出现错误是因为您没有在引用的列上定义索引。
从文档中
mysql需要外键和引用键的索引,这样外键检查可以很快,并且不需要表扫描。
和
innodb允许外键引用任何列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同顺序列为第一列。
没有为定义索引
Options
中的列Master
或者Options
table。这将导致您得到的错误。也,
此外,出于性能原因,mysql要求对引用的列进行索引。但是,系统不强制要求引用的列是唯一的或声明为非null。对于诸如update或delete cascade之类的操作,没有很好地定义对非唯一键或包含空值的键的外键引用的处理。建议您使用只引用唯一键(包括主键)而不引用空键的外键。
两者
Options
列允许null,并且您没有将它们定义为唯一的。这不会阻止您创建fks,但可能意味着当您创建fks时,它们将不会如您所期望的那样工作。