Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
-- -----------------------------------------------------
-- Table `MeliaDTB`.`hotel`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `MeliaDTB`.`hotel` (
`ID` INT NOT NULL,
`nombre` VARCHAR(45) NOT NULL,
`gerente` VARCHAR(45) NOT NULL,
`dir_postal` VARCHAR(45) NOT NULL,
`ciudad` VARCHAR(45) NOT NULL,
`cadena` INT NOT NULL,
`estrellas` INT NOT NULL,
PRIMARY KEY (`ID`),
INDEX `fk_hotel_ciudad1_idx` (`ciudad` ASC),
INDEX `fk_hotel_cadena_hotelera1_idx` (`cadena` ASC),
CONSTRAINT `fk_hotel_ciudad1`
FOREIGN KEY (`ciudad`)
REFERENCES `MeliaDTB`.`ciudad` (`nombre`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_hotel_cadena_hotelera1`
FOREIGN KEY (`cadena`)
REFERENCES `MeliaDTB`.`cadena_hotelera` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
SQL script execution finished: statements: 11 succeeded, 1 failed
Fetching back view definitions in final form.
Nothing to fetch
完整的表格列表:
如您所见,我在表中收到错误hotel
,但我没有看到问题。我一直在想这是因为我是从另一个表中取VARCHAR值,但是如果我取INT(主键)它会给我同样的问题1215
简短回答
首先,您必须为表中的列添加
nombre
索引ciudad
:这是因为InnoDB 要求引用的列或列组在它们上具有索引(SQL 标准并不真正支持这一点,而是 InnoDB 扩展)。
长答案
MySQL 中的 1215 错误只是“无法添加外键”。这可能是由于不同的原因,我见过的最常见的是:
最后一点是几乎可以肯定导致错误的一点。问题是您没有在表上
ciudad
为 field定义任何索引nombre
。然后外键的定义fk_hotel_ciudad1_idx
将失败(定义将fk_hotel_cadena_hotelera1_idx
正常工作,因为它引用了一个作为主键的字段)。作为建议,我会考虑稍微更改您的数据库结构并使外键指向主键或唯一键。尽管您随后必须进行连接以获取城市名称的值,但它们将使数据库更加健壮且更易于维护(和迁移)。