gpt4 book ai didi

mysql - MySQL 中的外键问题

转载 作者:行者123 更新时间:2023-11-29 18:40:52 26 4
gpt4 key购买 nike

我正在开发一个项目,在该项目中我对项目的现有数据库架构设计进行了扩展。我决定让 MySQL Workbench 创建 ER 图,我在其中添加了具有关系的新表。已经存在的部分由许多完全没有关系的表组成。和同事一起设计后,我通过查看the YouTube video以SQL脚本的形式导出ER数据。并得到一个SQL文件。保存文件时出现问题,因此我将其复制到缓存中并将其放入文件中。您可以在下面看到新创建的部分。

运行代码时,旧表(附件中未包含的部分)运行没有问题,但无法创建带有外键的新表,因为 MySQL Error 1215: Cannot add foreign key constraint问题。首先,我使用复制/粘贴到 MySQL 数据库的 SQL 窗口逐一尝试脚本生成的命令,在其中单独执行它们,然后发现我上面已经写过的新表及其关系导致的结果问题。尽管我尝试通过遵循此问题的答案来修复错误,但我未能消除该错误。 enter image description here您可以在上图中看到用黄色标记的旧表(小写)。

我在脚本中所做的就是通过替换现有的其他名称来使所有引擎成为 InnoDB,但没有效果。关键字段都是INT类型,并且没有ON DELETE SET NULL命令。我还在 SQL 脚本中将字符集从 latin1 更改为连贯的 utf8,但现在我不知道还能做什么才能使生成的脚本在MySQL 数据库。

你也遇到过类似的问题吗?你认为我接下来要做什么?

感谢您的帮助!

这是数据库的修改部分,由 MySQL Workbench 生成:

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


-- -----------------------------------------------------
-- Table `test_apptest`.`Addresses_have_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Addresses_have_Persons` (
`Addresses_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Addresses_ID`, `Persons_ID`),
INDEX `fk_Addresses_have_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Addresses_have_Persons_Addresses1_idx` (`Addresses_ID` ASC),
CONSTRAINT `fk_Addresses_have_Persons_Addresses1`
FOREIGN KEY (`Addresses_ID`)
REFERENCES `test_apptest`.`Addresses` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Addresses_have_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Groups_have_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Groups_have_Persons` (
`Groups_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Groups_ID`, `Persons_ID`),
INDEX `fk_Groups_have_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Groups_have_Persons_Groups1_idx` (`Groups_ID` ASC),
CONSTRAINT `fk_Groups_have_Persons_Groups1`
FOREIGN KEY (`Groups_ID`)
REFERENCES `test_apptest`.`Groups` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Groups_have_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Groups_have_Roles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Groups_have_Roles` (
`Groups_ID` INT NOT NULL,
`Roles_ID` INT NOT NULL,
PRIMARY KEY (`Groups_ID`, `Roles_ID`),
INDEX `fk_Groups_have_Roles_Roles1_idx` (`Roles_ID` ASC),
INDEX `fk_Groups_have_Roles_Groups1_idx` (`Groups_ID` ASC),
CONSTRAINT `fk_Groups_have_Roles_Groups1`
FOREIGN KEY (`Groups_ID`)
REFERENCES `test_apptest`.`Groups` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Groups_have_Roles_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Roles_have_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Roles_have_Persons` (
`Roles_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Roles_ID`, `Persons_ID`),
INDEX `fk_Roles_have_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Roles_have_Persons_Roles1_idx` (`Roles_ID` ASC),
CONSTRAINT `fk_Roles_have_Persons_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Roles_have_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `test_apptest`.`Roles_have_Rights`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Roles_have_Rights` (
`Roles_ID` INT NOT NULL,
`Rights_ID` INT NOT NULL,
PRIMARY KEY (`Roles_ID`, `Rights_ID`),
INDEX `fk_Roles_have_Rights_Rights1_idx` (`Rights_ID` ASC),
INDEX `fk_Roles_have_Rights_Roles1_idx` (`Roles_ID` ASC),
CONSTRAINT `fk_Roles_have_Rights_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Roles_have_Rights_Rights1`
FOREIGN KEY (`Rights_ID`)
REFERENCES `test_apptest`.`Rights` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

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

这是最初未经修改的生成代码,也导致了错误:

-- 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 test_apptest
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema test_apptest
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `test_apptest` DEFAULT CHARACTER SET latin1 ;
USE `test_apptest` ;

-- […]

-- -----------------------------------------------------
-- Table `test_apptest`.`Countries`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Countries` (
`ID` INT NOT NULL,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`States`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`States` (
`ID` INT NOT NULL,
`name` VARCHAR(45) NULL,
`Countries_ID` INT NOT NULL,
PRIMARY KEY (`ID`, `Countries_ID`),
INDEX `fk_States_Countries1_idx` (`Countries_ID` ASC),
CONSTRAINT `fk_States_Countries1`
FOREIGN KEY (`Countries_ID`)
REFERENCES `test_apptest`.`Countries` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Addresses`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Addresses` (
`ID` INT NOT NULL AUTO_INCREMENT,
`ZIP` VARCHAR(12) NULL,
`countryID` INT NOT NULL,
`stateID` INT NULL,
`settlement` VARCHAR(64) NOT NULL,
`street` VARCHAR(50) NOT NULL,
`addition` VARCHAR(64) NULL,
`phone` VARCHAR(22) NULL,
`Countries_ID` INT NOT NULL,
`States_ID` INT NOT NULL,
`States_Countries_ID` INT NOT NULL,
PRIMARY KEY (`ID`),
INDEX `fk_Addresses_Countries1_idx` (`Countries_ID` ASC),
INDEX `fk_Addresses_States1_idx` (`States_ID` ASC, `States_Countries_ID` ASC),
CONSTRAINT `fk_Addresses_Countries1`
FOREIGN KEY (`Countries_ID`)
REFERENCES `test_apptest`.`Countries` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Addresses_States1`
FOREIGN KEY (`States_ID` , `States_Countries_ID`)
REFERENCES `test_apptest`.`States` (`ID` , `Countries_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Filters`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Filters` (
`ID` INT NOT NULL,
`filter` BLOB NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Groups`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Groups` (
`ID` INT NOT NULL,
`name` VARCHAR(64) NOT NULL,
`description` VARCHAR(1024) NULL,
`Filters_ID` INT NOT NULL,
PRIMARY KEY (`ID`, `Filters_ID`),
INDEX `fk_Groups_Filters1_idx` (`Filters_ID` ASC),
CONSTRAINT `fk_Groups_Filters1`
FOREIGN KEY (`Filters_ID`)
REFERENCES `test_apptest`.`Filters` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Persons` (
`ID` INT NOT NULL,
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`firstName` VARCHAR(255) NOT NULL,
`lastName` VARCHAR(255) NOT NULL,
`eMail` VARCHAR(50) NOT NULL,
`standardAddressID` INT NOT NULL,
`address1ID` INT NULL,
`address2ID` INT NULL,
`phone1` VARCHAR(50) NOT NULL,
`phone2` VARCHAR(50) NULL,
`status` INT NULL,
`publicMail` VARCHAR(255) NULL,
`advisorID` INT NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Roles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Roles` (
`ID` INT NOT NULL,
`name` VARCHAR(64) NOT NULL,
`description` VARCHAR(1024) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Groups_have_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Groups_have_Persons` (
`Groups_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Groups_ID`, `Persons_ID`),
INDEX `fk_Groups_has_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Groups_has_Persons_Groups1_idx` (`Groups_ID` ASC),
CONSTRAINT `fk_Groups_has_Persons_Groups1`
FOREIGN KEY (`Groups_ID`)
REFERENCES `test_apptest`.`Groups` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Groups_has_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Addresses_have_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Addresses_have_Persons` (
`Addresses_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Addresses_ID`, `Persons_ID`),
INDEX `fk_Addresses_has_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Addresses_has_Persons_Addresses1_idx` (`Addresses_ID` ASC),
CONSTRAINT `fk_Addresses_has_Persons_Addresses1`
FOREIGN KEY (`Addresses_ID`)
REFERENCES `test_apptest`.`Addresses` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Addresses_has_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Rights`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Rights` (
`ID` INT NOT NULL,
`name` VARCHAR(64) NOT NULL,
`description` VARCHAR(1024) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Roles_have_Rights`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Roles_have_Rights` (
`Roles_ID` INT NOT NULL,
`Rights_ID` INT NOT NULL,
PRIMARY KEY (`Roles_ID`, `Rights_ID`),
INDEX `fk_Roles_has_Rights_Rights1_idx` (`Rights_ID` ASC),
INDEX `fk_Roles_has_Rights_Roles1_idx` (`Roles_ID` ASC),
CONSTRAINT `fk_Roles_has_Rights_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Roles_has_Rights_Rights1`
FOREIGN KEY (`Rights_ID`)
REFERENCES `test_apptest`.`Rights` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Groups_has_Roles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Groups_has_Roles` (
`Groups_ID` INT NOT NULL,
`Roles_ID` INT NOT NULL,
PRIMARY KEY (`Groups_ID`, `Roles_ID`),
INDEX `fk_Groups_has_Roles_Roles1_idx` (`Roles_ID` ASC),
INDEX `fk_Groups_has_Roles_Groups1_idx` (`Groups_ID` ASC),
CONSTRAINT `fk_Groups_has_Roles_Groups1`
FOREIGN KEY (`Groups_ID`)
REFERENCES `test_apptest`.`Groups` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Groups_has_Roles_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `test_apptest`.`Roles_has_Persons`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `test_apptest`.`Roles_has_Persons` (
`Roles_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL,
PRIMARY KEY (`Roles_ID`, `Persons_ID`),
INDEX `fk_Roles_has_Persons_Persons1_idx` (`Persons_ID` ASC),
INDEX `fk_Roles_has_Persons_Roles1_idx` (`Roles_ID` ASC),
CONSTRAINT `fk_Roles_has_Persons_Roles1`
FOREIGN KEY (`Roles_ID`)
REFERENCES `test_apptest`.`Roles` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Roles_has_Persons_Persons1`
FOREIGN KEY (`Persons_ID`)
REFERENCES `test_apptest`.`Persons` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- […]


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

下面是 MySQL Workbench 创建 SQL 脚本的新部分的设计: enter image description here

最佳答案

我认为您不需要在映射表上添加主键。尝试创建没有主键和索引的表(使用 innodb 时,添加外键将为您创建索引)。

第 1 步:

CREATE TABLE IF NOT EXISTS `test_apptest`.`Addresses_have_Persons` (
`Addresses_ID` INT NOT NULL,
`Persons_ID` INT NOT NULL)
ENGINE = InnoDB;

第 2 步:

ALTER TABLE Addresses_have_Persons 
ADD CONSTRAINT fk_Addresses_have_Persons_Addresses1
FOREIGN KEY(Addresses_ID)
REFERENCES Addresses(ID);

第 3 步:

ALTER TABLE Addresses_have_Persons 
ADD CONSTRAINT fk_Addresses_have_Persons_Persons1
FOREIGN KEY(Persons_ID)
REFERENCES Persons(ID);

关于mysql - MySQL 中的外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com