MySQL:引用的列是否需要是主键?

时间:2018-03-13 02:24:49

标签: mysql sql

当我执行以下SQL代码来创建数据库和表时,我收到错误消息:Error Code: 1215. Cannot add foreign key constraint。如果我将test.book.storeID作为主键,则代码可以正常工作。引用的列是否必须是主键?

CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 ;
USE `test` ;

CREATE TABLE IF NOT EXISTS `test`.`book` (
  `ID` INT UNSIGNED NOT NULL,
  `storeID` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE INDEX `storeID_UNIQUE` (`storeID` ASC))
  ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `test`.`shoppingCartItem` (
  `userID` INT UNSIGNED NOT NULL,
  `bookID` INT UNSIGNED NOT NULL,
  `storeID` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`userID`, `bookID`),
  INDEX `fk_idx` (`bookID` ASC, `storeID` ASC),
  CONSTRAINT `fk`
  FOREIGN KEY (`bookID` , `storeID`)
  REFERENCES `test`.`book` (`ID` , `storeID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
  ENGINE = InnoDB;

2 个答案:

答案 0 :(得分:1)

外键引用应该是主键,尽管它也可以是唯一键。 MySQL允许外键关系到任何索引列,但我不建议这样做。

因此,外键引用应为:

FOREIGN KEY (`bookID`) REFERENCES `test`.`book` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION

我确实怀疑为什么你在两个表中都有storeid。如果它们必须相同,那么它应该只在一个表中,你可以使用密钥查找它。

答案 1 :(得分:0)

查看此问题中的答案是否有助does foreign key always reference to a unique key in another table?,基本上它必须是唯一的,而不是主要的。