开发者社区 问答 正文

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

我在哪里做错了?

展开
收起
保持可爱mmm 2020-05-11 11:18:10 479 分享 版权
1 条回答
写回答
取消 提交回答
  • 创建外键约束时,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) 在大多数情况下,这通常不是问题,因为被引用字段通常是被引用表的主键,并且主键会自动索引。来源:stack overflow

    2020-05-11 11:18:25
    赞同 展开评论