当前位置: 首页 > 面试题库 >

MySQL外键错误1005错误150

裴经义
2023-03-14
问题内容

我正在用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的内部存储类型已更改,并且新表中的此类列不能引用旧表中的此类列。

我在哪里做错了?


问题答案:

创建外键约束时,MySQL在引用表和被引用表上都需要一个可用的索引。如果不存在引用表上的索引,则会自动创建索引,但需要手动创建引用表上的索引(Source)。您的似乎丢失了。

测试用例:

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: 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)

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



 类似资料:
  • 问题内容: 我对在MySQL中添加外键有些困惑 我想做的是参考带有以下内容的学生主键: 但是,我得到的是 我四处搜寻,发现 MySQL“错误1005(HY000):无法创建表’foo。#sql-12c_4’(errno:150)” 但是,我的学生表已经有一个主键,因此这应该不是问题: 我感觉好像缺少了一些基本的东西,但是似乎看不到它。有什么建议吗? 问题答案: 您应该在被引用表之后添加被引用列的名

  • 问题内容: 当我执行以下两个查询时(我将它们简化为绝对必要): 我收到以下错误:错误1005(HY000):无法创建表’./test/bar.frm’(errno:150) 我的错误在哪里?半个小时盯着我看,我还没找到他。 问题答案: 来自约束 如果重新创建已删除的表,则该表必须具有符合引用该表的外键约束的定义。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。如果不满足这些条件

  • 我用phpmyadmin导出了我的数据库,其中包括禁用外键和执行到单个事务中,如果存在则删除表,但是当我想导入文件mysql时会抛出一个错误: 第35行错误1215(HY000):无法添加外键约束 谢谢你。

  • 问题内容: 我正在运行以下由 MySQL Workbench 自动生成的MySQL脚本(已精简),出现以下错误: 1005无法创建表“ regula.reservation”(错误号:121) 我对数据库不是很精通,并且此错误也不是非常有用。 这里有什么问题? 问题答案: 错误121表示存在外键约束错误。由于您使用的是InnoDB,因此您可以在运行失败的查询后使用,以在本节中获得解释。我自己运行了

  • 问题内容: 我有两个表,是一列父表,并与一列(而不是实际的名称),当我把一个FK上,以在我得到的错误。如果要删除记录,我想删除表2记录。谢谢你的帮助 让我知道是否需要其他信息。我是mysql新手 问题答案: 我在HeidiSQL中遇到了同样的问题。您收到的错误非常神秘。我的问题最终是外键列和引用列的类型或长度不同。 外键列为,引用列为。一旦将它们设置为完全相同的类型,外键创建就可以完美地工作了。

  • null null null null null