2013-08-20 161 views
0

我有一個表不能添加或更新子行,外鍵約束失敗

1.

CREATE TABLE `Parent` (
`ID` bigint(19) NOT NULL DEFAULT '0', 
PRIMARY KEY (`ID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

2.

CREATE TABLE `Child_1` (
`ParentID` bigint(19) NOT NULL DEFAULT '0', 
`ID` bigint(19) NOT NULL DEFAULT '0', 
PRIMARY KEY (`ParentID`,`ID`), 
KEY `Child_1_FK1_IDX` (`ParentID`,`ID`), 
CONSTRAINT `Child_1_FK1` FOREIGN KEY (`ParentID`, `ID`) REFERENCES `Child_2` (`ParentID`, `ID`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

3.

CREATE TABLE `Child_2` (
`ParentID` bigint(19) NOT NULL DEFAULT '0', 
`ID` bigint(19) NOT NULL DEFAULT '0', 
PRIMARY KEY (`ParentID`,`ID`), 
KEY `Child_2_FK1_IDX` (`ParentID`), 
CONSTRAINT `Child_2_FK1` FOREIGN KEY (`ParentID`) REFERENCES `Parent` (`ParentID`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

不幸的是,我已經刪除了第二個表約束。

CONSTRAINT `Child_1_FK1` FOREIGN KEY (`ParentID`, `ID`) REFERENCES `Child_2` (`ParentID`, `ID`) ON DELETE CASCADE 

我該如何恢復?

回答

0

這是更好地採取傾倒。冷啓動數據庫。

0

試試這個(未測試):

ALTER TABLE Child_1 
ADD FOREIGN KEY (`ParentID`, `ID`) 
REFERENCES `Child_2` (`ParentID`, `ID`) 
ON DELETE CASCADE 

更新:

爲了得到記錄違反約束,運行此:

select child1.ID from 
    Child_1 child1 left join Child_2 child2 on child1.ParentID=child2.ParentID and child1.ID=child2.ID 
where child2.ID is null and child2.ParentID is null; 
+0

當我測試此查詢,我得到了「不能添加或更新子行,外鍵約束失敗」 – Suresh

+0

這意味着,數據已插入到違反約束的表...請刪除這些記錄( s),然後運行這個將約束添加到表 – rags

+0

你能解決這個問題嗎? – rags

相關問題