2011-05-13 77 views
3

我有如下模式的數據庫: enter image description here不能添加或更新子行,外鍵約束失敗

下面的SQL創建相關的表:

-- ----------------------------------------------------- 
-- Table `ninikske_bioldb`.`CodingRegion` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ninikske_bioldb`.`CodingRegion` (
    `CodRegID` VARCHAR(45) NOT NULL , 
     `CD_Start` INT NOT NULL , 
    `CD_Stop` INT NOT NULL , 
    `ORFs_ORF_ID` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`ORFs_ORF_ID`, `CodRegID`) , 
    INDEX `fk_Exons_ORFs1` (`ORFs_ORF_ID` ASC) , 
    CONSTRAINT `fk_Exons_ORFs1` 
    FOREIGN KEY (`ORFs_ORF_ID`) 
    REFERENCES `ninikske_bioldb`.`ORFs` (`ORF_ID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 
-- Table `ninikske_bioldb`.`Experiment` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ninikske_bioldb`.`Experiment` (
    `Probe_GenomicPos` INT NOT NULL , 
    `SampleName` VARCHAR(45) NOT NULL , 
    `Intensities` FLOAT NOT NULL , 
    `ExperimentName` VARCHAR(45) NOT NULL , 
    `ProbeID` INT NOT NULL , 
    PRIMARY KEY (`Probe_GenomicPos`, `SampleName`, `ProbeID`)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `ninikske_bioldb`.`CE` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `ninikske_bioldb`.`CE` (
    `OrfId` VARCHAR(45) NOT NULL , 
    `CodRegId` VARCHAR(45) NOT NULL , 
    `GenPos` INT NOT NULL , 
    `ExpSam` VARCHAR(45) NOT NULL , 
    `ProbeId` INT NOT NULL , 
     PRIMARY KEY (`OrfId`, `CodRegId`, `GenPos`, `ExpSam`, `ProbeId`) , 
    INDEX `fk_CodingRegion_has_Experiment_Experiment1` (`GenPos` ASC, `ExpSam` ASC, `ProbeId` ASC) , 
    INDEX `fk_CodingRegion_has_Experiment_CodingRegion1` (`OrfId` ASC, `CodRegId` ASC) , 
    CONSTRAINT `fk_CodingRegion_has_Experiment_CodingRegion1` 
    FOREIGN KEY (`OrfId` , `CodRegId`) 
    REFERENCES `ninikske_bioldb`.`CodingRegion` (`ORFs_ORF_ID` , `CodRegID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_CodingRegion_has_Experiment_Experiment1` 
    FOREIGN KEY (`GenPos` , `ExpSam` , `ProbeId`) 
    REFERENCES `ninikske_bioldb`.`Experiment` (`Probe_GenomicPos` , `SampleName` , `ProbeID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

當我執行通過Java下面的INSERT語句:

String query = "INSERT INTO ninikske_bioldb.CE VALUES('" + cs.getORF_ID().getORF_ID() + "','" + cs.getCodRegID().getCodRegID() + "'," + cs.getExp().getProbePos() + ",'" + cs.getExp().getExpName()+ "', " + cs.getExp().getProbeID() + ");"; 
Statement stmt = con.createStatement(); 
stmt.executeUpdate(query); 

我得到以下錯誤:

Cannot add or update a child row: a foreign key constraint fails (`ninikske_bioldb/CE`, CONSTRAINT `fk_CodingRegion_has_Experiment_Experiment1` FOREIGN KEY (`GenPos`, `ExpSam`, `ProbeId`) REFERENCES `Experiment` (`Probe_GenomicPos`, `SampleName`, `ProbeID`)) 

我讀了幾個關於同樣的錯誤信息的其他問題,但我似乎無法找到我需要的洞察力。

編輯 查詢是: INSERT INTO ninikske_bioldb.CE VALUES('AT3G01190.1','cd474',67262,'H20', 1709);

當我檢查我的父表,我得到以下結果:提前

mysql> SELECT * FROM CodingRegion WHERE ORFs_ORF_ID = 'AT3G01190.1'; 
+----------+----------+---------+-------------+ 
| CodRegID | CD_Start | CD_Stop | ORFs_ORF_ID | 
+----------+----------+---------+-------------+ 
| cd474 | 67243 | 67649 | AT3G01190.1 | 
| cd475 | 67733 | 67892 | AT3G01190.1 | 
| cd476 | 67991 | 68176 | AT3G01190.1 | 
| cd477 | 68272 | 68484 | AT3G01190.1 | 
+----------+----------+---------+-------------+ 
4 rows in set (0.00 sec) 

mysql> SELECT * FROM CodingRegion WHERE CodRegID = 'cd474';  
+----------+----------+---------+-------------+ 
| CodRegID | CD_Start | CD_Stop | ORFs_ORF_ID | 
+----------+----------+---------+-------------+ 
| cd474 | 67243 | 67649 | AT3G01190.1 | 
+----------+----------+---------+-------------+ 
1 row in set (0.03 sec) 

mysql> SELECT * FROM Experiment WHERE Probe_GenomicPos = '67262'; 
+------------------+--------------+-------------+----------------+---------+ 
| Probe_GenomicPos | SampleName | Intensities | ExperimentName | ProbeID | 
+------------------+--------------+-------------+----------------+---------+ 
|   67262 | 1signalpart1 |  8.94432 | H20   | 1709 | 
+------------------+--------------+-------------+----------------+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM Experiment WHERE SampleName = 'H20' 
Empty set (0.00 sec) 


mysql> SELECT * FROM Experiment WHERE ProbeID = '1709';   
+------------------+--------------+-------------+----------------+---------+ 
| Probe_GenomicPos | SampleName | Intensities | ExperimentName | ProbeID | 
+------------------+--------------+-------------+----------------+---------+ 
|   67262 | 1signalpart1 |  8.94432 | H20   | 1709 | 
+------------------+--------------+-------------+----------------+---------+ 
1 row in set (0.00 sec) 

感謝。

+0

是否所有您插入的ID都存在於父表中? – gmadd 2011-05-13 15:56:50

+0

和'String query'的輸出是什麼? – gmadd 2011-05-13 16:09:09

+0

@gmadd看我的編輯。 – BioGeek 2011-05-13 16:23:59

回答

7

失敗的約束「fk_CodingRegion_has_Experiment_Experiment1」要求您爲這三列(GenPos,ExpSam和ProbeId)輸入的值已存在於Probe_GenomicPos,SampleName列中的「ninikske_bioldb.Experiment」表中,和ProbeID。 (按該順序)。

查看錶ninikske_bioldb.Experiment這三個值。

SELECT * 
FROM ninikske_bioldb.Experiment 
WHERE Probe_GenomicPos = ? 
    AND SampleName = '?' 
    AND ProbeID = ? 

這有可能是

  • 表 實驗的主鍵是錯誤的(應包括 ExperimentName而非 SampleName),或
  • 外鍵引用是錯誤的 (應參考ExperimentName 而不是SampleName)或
  • 函數cs.getExp()。getExpName() 是錯誤的函數使用。

我覺得最後一個是最有可能的。可能應該是getSampleName()或類似的東西。

+0

你釘了它!它確實是函數'cs.getExp()。getExpName()'這是錯誤的。用cs.getExp()。getSampleName()代替它(正如你預計的那樣)確實解決了這個問題。 – BioGeek 2011-05-13 16:43:56

+6

一致命名約定的另一個好說法。允許在StackOverflow上免費進行遠程調試。 – 2011-05-13 17:42:31

相關問題