MySQL外鍵錯誤1005錯誤150我正在使用MySQL Workbench做一個小型數(shù)據(jù)庫。我有一個名為“Immobili”的主表,它有一個由四列組成的主鍵:( Comune,Via,Civico,Immobile)?,F(xiàn)在,我還有另外三個表,它們具有相同的主鍵(Comune,Via,Civico,Immobile),但這些字段也引用了表Immobili。第一個問題:我可以制作一個也是外鍵的主鍵嗎?第二個問題:當(dāng)我嘗試導(dǎo)出更改時,它說:在服務(wù)器中執(zhí)行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顯示引擎狀態(tài):表dbimmobili / valutazionimercato的外鍵約束出錯:在引用的表中找不到索引,其中引用的列顯示為第一列,或者表中的列類型和引用的表與約束不匹配。請注意,使用> = InnoDB-4.1.12創(chuàng)建的表中ENUM和SET的內(nèi)部存儲類型已更改,舊表中的此類列不能被新表中的此類列引用。我做錯了什么?
3 回答

有只小跳蛙
TA貢獻1824條經(jīng)驗 獲得超8個贊
創(chuàng)建外鍵約束時,MySQL需要在引用表和引用表上都有可用的索引。如果不存在,則會自動創(chuàng)建引用表上的索引,但需要手動創(chuàng)建引用表上的索引(源)。你的似乎不見了。
測試用例:
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: 0CREATE 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)
在大多數(shù)情況下,這通常不是問題,因為引用的字段通常是引用表的主鍵,并且主鍵是自動索引的。

侃侃爾雅
TA貢獻1801條經(jīng)驗 獲得超16個贊
仔細檢查外鍵是否與此表中的字段具有完全相同的類型。例如,兩者都應(yīng)該是Integer(10)或Varchar(8),甚至是字符數(shù)。
添加回答
舉報
0/150
提交
取消