为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL外键错误1005错误150

MySQL外键错误1005错误150

HUX布斯 2019-08-13 16:01:30
MySQL外键错误1005错误150我正在使用MySQL Workbench做一个小型数据库。我有一个名为“Immobili”的主表,它有一个由四列组成的主键:( Comune,Via,Civico,Immobile)。现在,我还有另外三个表,它们具有相同的主键(Comune,Via,Civico,Immobile),但这些字段也引用了表Immobili。第一个问题:我可以制作一个也是外键的主键吗?第二个问题:当我尝试导出更改时,它说:在服务器中执行SQL脚本# ERROR: Error 1005: Can't create table 'dbimmobili.condoni' (errno: 150)CREATE  TABLE IF NOT EXISTS `dbimmobili`.`Condoni` (   `ComuneImmobile` VARCHAR(50) NOT NULL ,   `ViaImmobile` VARCHAR(50) NOT NULL ,   `CivicoImmobile` VARCHAR(5) NOT NULL ,   `InternoImmobile` VARCHAR(3) NOT NULL ,   `ProtocolloNumero` VARCHAR(15) NULL ,   `DataRichiestaSanatoria` DATE NULL ,   `DataSanatoria` DATE NULL ,   `SullePartiEsclusive` TINYINT(1) NULL ,   `SullePartiComuni` TINYINT(1) NULL ,   `OblazioneInEuro` DOUBLE NULL ,   `TecnicoOblazione` VARCHAR(45) NULL ,   `TelefonoTecnico` VARCHAR(15) NULL ,   INDEX `ComuneImmobile` (`ComuneImmobile` ASC) ,   INDEX `ViaImmobile` (`ViaImmobile` ASC) ,   INDEX `CivicoImmobile` (`CivicoImmobile` ASC) ,   INDEX `InternoImmobile` (`InternoImmobile` ASC) ,   PRIMARY KEY (`ComuneImmobile`, `ViaImmobile`, `CivicoImmobile`, `InternoImmobile`) ,   CONSTRAINT `ComuneImmobile`     FOREIGN KEY (`ComuneImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`ComuneImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,   CONSTRAINT `ViaImmobile`     FOREIGN KEY (`ViaImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`ViaImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,   CONSTRAINT `CivicoImmobile`     FOREIGN KEY (`CivicoImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`CivicoImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,   CONSTRAINT `InternoImmobile`     FOREIGN KEY (`InternoImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`InternoImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE) ENGINE = InnoDB显示引擎状态:表dbimmobili / valutazionimercato的外键约束出错:在引用的表中找不到索引,其中引用的列显示为第一列,或者表中的列类型和引用的表与约束不匹配。请注意,使用> = InnoDB-4.1.12创建的表中ENUM和SET的内部存储类型已更改,旧表中的此类列不能被新表中的此类列引用。我做错了什么?
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

创建外键约束时,MySQL需要在引用表和引用表上都有可用的索引。如果不存在,则会自动创建引用表上的索引,但需要手动创建引用表上的索引()。你的似乎不见了。

测试用例:

CREATE TABLE tbl_a (
    id int PRIMARY KEY,
    some_other_id int,
    value int) ENGINE=INNODB;Query OK, 0 rows affected (0.10 sec)CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)) ENGINE=INNODB;ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150)

但是,如果我们添加一个索引some_other_id

CREATE INDEX ix_some_id ON tbl_a (some_other_id);Query OK, 0 rows affected (0.11 sec)Records: 0  Duplicates: 0  Warnings: 0CREATE TABLE tbl_b (
    id int PRIMARY KEY,
    a_id int,
    FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)) ENGINE=INNODB;Query OK, 0 rows affected (0.06 sec)

在大多数情况下,这通常不是问题,因为引用的字段通常是引用表的主键,并且主键是自动索引的。


查看完整回答
反对 回复 2019-08-13
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

仔细检查外键是否与此表中的字段具有完全相同的类型。例如,两者都应该是Integer(10)或Varchar(8),甚至是字符数。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 511 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信