【问题标题】:Error Code: 1822. Failed to add the foreign key constraint错误代码:1822。添加外键约束失败
【发布时间】:2020-10-27 15:40:42
【问题描述】:
CREATE TABLE `branch` (
  `BranchID` INT NOT NULL, 
  `BranchSuburb` varchar(255) NOT NULL,
  `BranchState` char(3) NOT NULL,
  PRIMARY KEY (`BranchID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `member` (
  `MemberID` INT NOT NULL, 
  `MemberStatus` char(9) DEFAULT 'REGULAR',
  `MemberName` varchar(255) NOT NULL,
  `MemberAddress` varchar(255) NOT NULL,
  `MemberSuburb` varchar(25) NOT NULL,
  `MemberState` char(3) NOT NULL,
  `MemberExpDate` DATE,
  `MemberPhone` varchar(10),
  PRIMARY KEY (`MemberID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `publisher` (
  `PublisherID` INT NOT NULL, 
  `PublisherName` varchar(255) NOT NULL,
  `PublisherAddress` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`PublisherID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `book` (
  `BookID` INT NOT NULL,
  `BookTitle` varchar(255) NOT NULL,
  `PublisherID` INT NOT NULL,
  `PublishedYear` INT4,
  `Price` Numeric(5,2) NOT NULL,
  PRIMARY KEY (`BookID`),
  KEY `PublisherID` (`PublisherID`),
  CONSTRAINT `publisher_fk_1` FOREIGN KEY (`PublisherID`) REFERENCES `publisher` (`PublisherID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `author` (
  `AuthorID` INT NOT NULL, 
  `AuthorName` varchar(255) NOT NULL,
  `AuthorAddress` varchar(255) NOT NULL,
  PRIMARY KEY (`AuthorID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `authoredby` (
  `BookID` INT NOT NULL,
  `AuthorID` INT NOT NULL, 
  PRIMARY KEY (`BookID`,`AuthorID`),
  KEY `bookID` (`BookID`),
  KEY `AuthorID` (`AuthorID`),
  CONSTRAINT `book_fk_1` FOREIGN KEY (`BookID`) REFERENCES `book` (`bookID`) ON DELETE RESTRICT,
  CONSTRAINT `author_fk_1` FOREIGN KEY (`AuthorID`) REFERENCES `author` (`AuthorID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `holding` (
  `BranchID` INT NOT NULL, 
  `BookID` INT NOT NULL,
  `InStock` INT DEFAULT 1,
  `OnLoan` INT DEFAULT 0,
  PRIMARY KEY (`BranchID`,`BookID`),
  KEY `bookID` (`BookID`),
  KEY `BranchID` (`BranchID`),
  CONSTRAINT `holding_cc_1` CHECK(`InStock`>=`OnLoan`),
  CONSTRAINT `book_fk_2` FOREIGN KEY (`BookID`) REFERENCES `book` (`bookID`) ON DELETE RESTRICT,
  CONSTRAINT `branch_fk_1` FOREIGN KEY (`BranchID`) REFERENCES `branch` (`BranchID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `borrowedby` (
  `BookIssueID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `BranchID` INT NOT NULL,
  `BookID` INT NOT NULL,
  `MemberID` INT NOT NULL,
  `DateBorrowed` DATE,
  `DateReturned` DATE DEFAULT NULL,
  `ReturnDueDate` DATE,
  PRIMARY KEY (`BookIssueID`),
  KEY `bookID` (`BookID`),
  KEY `BranchID` (`BranchID`),
  KEY `MemberID` (`MemberID`),
  CONSTRAINT `borrowedby_cc_1` CHECK(`DateBorrowed`<`ReturnDueDate`),
  CONSTRAINT `holding_fk_1` FOREIGN KEY (`BookID`,`BranchID`) REFERENCES `holding` (`BookID`,`BranchID`) ON DELETE RESTRICT,
  CONSTRAINT `member_fk_1` FOREIGN KEY (`MemberID`) REFERENCES `member` (`MemberID`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

当我尝试对所借表执行最后一个创建查询时,出现以下错误。 错误代码:1822。添加外键约束失败。引用表“holding”中缺少约束“holding_fk_1”的索引

【问题讨论】:

  • 为您整理了代码,请阅读meta.stackexchange.com/questions/22186/…以备将来参考
  • 错误信息告诉你到底是什么问题'在被引用的表中,必须有一个索引,其中被引用的列是相同顺序的第一列' - dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
  • 我在 mysql 8.022 中运行了您的代码,它在没有 htch 的情况下运行,因为您已经有一个主键来保存两列,错误消息不适合您的代码
  • 您的代码在 Mysql 8.0.12 中失败,但在 8.0.22 中运行良好 作为一种解决方法,颠倒列的顺序:CONSTRAINT holding_fk_1 FOREIGN KEY (BranchID,BookID) REFERENCES holding (BranchID,BookID) ON DELETE RESTRICT,

标签: mysql database


【解决方案1】:

你试过拆分双外键吗?像这样:

CONSTRAINT `holding_fk_1` FOREIGN KEY (`BookID`) REFERENCES `holding` (`BookID`) ON DELETE RESTRICT,
CONSTRAINT `holding_fk_1` FOREIGN KEY (`BranchID`) REFERENCES `holding` (`BranchID`) ON DELETE RESTRICT

您使用的是什么 dms?可能是您需要使用另一种语法来同时引用两个外键,也可能是它不受支持。

【讨论】:

  • 感谢您的回复。当我颠倒列的顺序时它工作了
【解决方案2】:

正如答案中所说,只需更改顺序即可解决。

“您的代码在 Mysql 8.0.12 中失败,但在 8.0.22 中运行良好作为一种解决方法,颠倒列的顺序:CONSTRAINT holding_fk_1 FOREIGN KEY (BranchID,BookID) REFERENCES holding (BranchID,BookID) ON DELETE RESTRICT, – 福帕斯 20 年 10 月 27 日 15:50"

【讨论】:

猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 2019-02-27
  • 2021-06-11
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多