Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL外键错误1005 errno 150主键作为外键_Mysql_Mysql Workbench_Mysql Error 1005 - Fatal编程技术网

MySQL外键错误1005 errno 150主键作为外键

MySQL外键错误1005 errno 150主键作为外键,mysql,mysql-workbench,mysql-error-1005,Mysql,Mysql Workbench,Mysql Error 1005,我正在用MySQL工作台制作一个小数据库。我有一个名为“Immobili”的主表,它有一个由四列组成的主键:(Comune、Via、Civico、Immobile) 我还有其他三个表,它们具有相同的主键(Comune、Via、Civico、Immobile),但这些字段也引用到表Immobili 第一个问题:我可以制作一个主键同时也是外键吗 第二个问题:当我尝试导出更改时,它会说: Executing SQL script in server # ERROR: Error 1005: Can'

我正在用MySQL工作台制作一个小数据库。我有一个名为“Immobili”的主表,它有一个由四列组成的主键:(Comune、Via、Civico、Immobile)

我还有其他三个表,它们具有相同的主键(Comune、Via、Civico、Immobile),但这些字段也引用到表Immobili

第一个问题:我可以制作一个主键同时也是外键吗

第二个问题:当我尝试导出更改时,它会说:

Executing SQL script in server

# 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的内部存储类型已更改,并且新表中的这些列无法引用旧表中的这些列


我哪里做错了?

仔细检查外键是否与此表中的字段类型完全相同。例如,两者都应该是整数(10)或Varchar(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)
但是如果我们在
其他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)

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

这不是您的具体情况,但值得注意的是,如果您试图引用表中的某些字段,而这些字段不是该表的整个主键,则可能会发生此错误。显然这是不允许的。

当主键有两列时,它们构成一个复合主键,因此您必须确保在被引用的表中也有两列相同的数据类型。

我遇到了相同的错误。我发现了一个解决方案,我在主表中将主键创建为BIGINT UNSIGNED,并在第二个表中将它声明为外键,作为惟一的BIGINT

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


因此,主键和外键之间的数据类型不匹配:)

如果任何人在形式良好的FK/PK关系中出现此错误,并且您使用了可视化工具,请尝试删除有问题的FK列并在工具中重新添加它们。我不断地遇到这个错误,直到我重新编写了连接,解决了问题

我遇到了完全相同的问题,但我的问题的解决方案完全不同。在数据库的其他地方,我有一个同名的外键。这导致了错误1005


将我的外键重命名为更具体的外键解决了这个问题。

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

如果您的键是CHAR/VARCHAR或类似类型的键,另一个可能的问题是不同的排序规则。检查字符集是否相同。

我的声誉还不足以支持史蒂夫的建议,但它解决了我的问题

在我的例子中,我收到这个错误是因为使用不同的数据库引擎创建的两个表——一个是Innodb,另一个是MyISAM

您可以使用以下命令更改数据库类型:altertable t ENGINE=MYISAM


@请参见

对于我来说,我试图将子表中的常规索引字段与父表中的主键进行匹配,默认情况下,某些MySQL前端GUI(如Sequel Pro)将主键设置为未签名,因此您必须确保子表字段也未签名(除非这些字段可能包含负整数,否则请确保它们都已签名)。

我有此错误,并在我的案例中找到了错误的原因。 我仍然在回复这篇老帖子,因为它在谷歌排名很高


我想链接的两个列的变量都是整数,但其中一个整数被选中了“unsigned”。只需取消检查就可以修复我的错误。

MySQL是出了名的古怪,特别是在外键和触发器方面。我现在正在微调一个这样的数据库,并遇到了这个问题。这不是问题如果是明显的或直观的,那么这里是:

除了检查要在关系中引用的两列是否具有相同的数据类型外,还必须确保要引用的表上的列是索引。如果使用MySQL工作台,请选择“列”旁边的“索引”选项卡并确保外键引用的列是索引。如果不是,则创建一个索引,将其命名为有意义的名称,并将其命名为“index”类型

一个好的做法是清理关系中涉及的表,以确保以前的尝试没有创建您不想要或不需要的索引

我希望这能有所帮助,一些MySQL错误令人抓狂

  • 确保两个表使用相同的发动机类型
  • 确保要编制索引的字段具有相同的类型和长度

  • 创建表时,请注意字符集整理参数。
    CREATE TABLE yourTableName (
    ....
    ....
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    Error Code: 1253. COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'latin1'
    
    ALTER TABLE table_name ENGINE=InnoDB;