【问题标题】:MySQL: Does the referenced column need to be primary key?MySQL:引用的列是否需要是主键?
【发布时间】:2018-03-13 02:24:49
【问题描述】:

当我执行以下 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;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

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

    所以,外键引用应该是:

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

    我确实质疑为什么您在两个表中都有storeid。如果它们需要相同,那么它应该只在一个表中,您可以使用键查找它。

    【讨论】:

    • UNIQUE INDEX 已存在,但仍无法添加外键约束。什么原因?
    • @AlpacaMan 。 . .您有两个键,而不是复合键。
    【解决方案2】:

    看看这个问题的答案是否对does foreign key always reference to a unique key in another table?有帮助,基本上它需要是唯一的,而不是主要的。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2021-01-08
      • 2011-03-04
      • 1970-01-01
      • 2012-11-15
      • 2013-11-11
      • 2012-03-22
      相关资源
      最近更新 更多