我正在用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的内部存储类型已更改,并且新表中的此类列不能引用旧表中的此类列。
表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:
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)
在大多数情况下,这通常不是问题,因为被引用字段通常是被引用表的主键,并且主键会自动索引。