2011-10-05 48 views
3

這裏有我的兩個表MySQL不能建立外鍵

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`。<結果2時解釋文件名 '#SQL-cf8_41a' >,約束`#SQL-cf8_41a_ibfk_1` FOREIGN KEY (`colorslibrary_ID`)參考`colorslibrary`(`ColorID`))

+0

這可能是危險的,因爲它表明汽車引用缺失的顏色。 –

回答

5

你的表是不是空的,因此約束在創建時失敗(未找到引用)。使用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他們到顏色庫中現有的父ColorID? INSERT colorslibrary表中的新ColorID用於處理孤行?

整理完數據後,您應該可以正常運行ALTER TABLE