MySQL外键错误1005错误150

Iss*_*mTP 39 mysql mysql-workbench mysql-error-1005

我正在使用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
Run Code Online (Sandbox Code Playgroud)

显示引擎状态:

表dbimmobili/valutazionimercato的外键约束出错:

在引用的表中找不到索引,其中引用的列显示为第一列,或者表中的列类型和引用的表与约束不匹配.请注意,使用> = InnoDB-4.1.12创建的表中ENUM和SET的内部存储类型已更改,旧表中的此类列不能被新表中的此类列引用.

我做错了什么?

Dan*_*llo 50

创建外键约束时,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)
Run Code Online (Sandbox Code Playgroud)

但是,如果我们添加一个索引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: 0

CREATE 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 记住索引创建的顺序,有时你必须纠正它. (4认同)
  • 我刚才有同样的错误.问题最终是我引用的外键具有数据类型"INT unsigned".我不确定这意味着什么,但将其更改为"INT"有效. (3认同)

dmp*_*dmp 30

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

  • 有符号/无符号整数也很重要!刚刚发现感谢您的回答. (5认同)
  • 即使像CAN_BE_NULL,UNSIGNED等标志,两个字段之间的任何微小差异都可能导致这样的错误.无论如何+1为danp,这是有帮助的 (2认同)

Ste*_*eve 15

我意识到这是一个老帖子,但它在谷歌中排名很高,所以我添加了我想出的问题.如果您有多种表格类型(例如MyISAM和InnoDB),您也会收到此错误.在这种情况下,InnoDB是默认的表类型,但是一个表需要全文搜索,因此它被迁移到MyISAM.在这种情况下,您无法在InnoDB表中创建引用MyISAM表的外键.


小智 9

如果您的密钥是CHAR/VARCHAR或类型的东西,另一个可能的问题是不同的整理.检查字符集是否相同.


小智 7

我有这个错误,并在我的情况下找到了错误的原因.我还在回答这个老帖子,因为它在Google上排名很高.

我想要链接的两列的变量都是整数,但其中一个int已经'unsigned'检查过.只需取消检查即可修复我的错误.


ilt*_*lid 5

我得到了同样的错误.我找到了解决方案,我在主表中创建了主键作为BIGINT UNSIGNED,并在第二个表中将其声明为外键,仅作为BIGINT.

当我在第二个表中将我的外键声明为BIGINT UNSIGED时,一切正常,甚至不需要创建任何索引.

所以它是主键和外键之间的数据类型不匹配:)