MySQL无法创建外键。

4

这是我的两个表格

CREATE TABLE IF NOT EXISTS `carslibrary` (   
  `CarID` int(10) unsigned NOT NULL AUTO_INCREMENT,   
  `CarName` varchar(255) NOT NULL,  
  `colorslibrary_ID` int(11) unsigned NOT NULL,   
  PRIMARY KEY (`CarID`),
  KEY `colorslibrary_ID` (`colorslibrary_ID`) 
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

CREATE TABLE IF NOT EXISTS `colorslibrary` (   
  `ColorID` int(11) unsigned NOT NULL AUTO_INCREMENT,   
  `ColorName` varchar(255) NOT NULL,
  PRIMARY KEY (`ColorID`) 
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

我在以下查询中遇到了一个错误:

ALTER TABLE  `carslibrary` ADD FOREIGN KEY (  `colorslibrary_ID` )
REFERENCES  `cars2`.`colorslibrary` (`ColorID` );

MySQL报错信息:

#1452 - 无法添加或更新子行:外键约束失败(`cars2`.<执行文件名为 '#sql-cf8_41a' 的结果 2>,约束 `#sql-cf8_41a_ibfk_1` 外键 (`colorslibrary_ID`) 参照 `colorslibrary` (`ColorID`))


这可能很危险,因为它表明汽车引用了一个缺失的颜色。 - Michael Mior
2个回答

7
你的表不是空的,因此在创建时会出现约束失败(引用未找到)。
使用 SET FOREIGN_KEY_CHECKS = 0; 并重新运行你的 alter table

2

首先,我会在 carslibrary 表中识别孤立的行:

select * from carslibrary where colorslibrary_ID not in (select ColorID from cars2.colorslibrary);

然后决定你想要如何处理这些孤立的行。想要从carslibrary表中DELETE删除它们吗?将它们UPDATE到colorslibrary中现有的父ColorID?在colorslibrary表中INSERT一个新的ColorID以满足孤立的行?

一旦整理好你的数据,你应该能够顺利运行ALTER TABLE而不出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接