2010-03-10 109 views
2

我有2個表與2之間的複合外鍵當我嘗試插入一個行到子表中時,即使值存在父表中,我得到約束失敗。MySQL複合外鍵插入失敗

這裏的父表的概述:

CREATE TABLE `residual_reports` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `processor` enum('1','2','3') NOT NULL, 
    `posting_date` date NOT NULL DEFAULT '0000-00-00', 
    `approved_on` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `posting_date_2` (`processor`,`posting_date`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

子表有外鍵處理器和發佈日期列:

CREATE TABLE `residual_data` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `mid` varchar(29) DEFAULT NULL, 
    `processor` enum('1','2','3') NOT NULL, 
    `posting_date` date NOT NULL, 
    ...... 
    PRIMARY KEY (`id`), 
    KEY `residual_data_ibfk_1` (`processor`,`posting_date`), 
    CONSTRAINT `residual_data_ibfk_1` FOREIGN KEY (`processor`, `posting_date`) REFERENCES `residual_reports` (`processor`, `posting_date`) ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

我插入一行到residual_reports表處理器= 1,並且posting_date = 2010-03-10。

當我嘗試插入到處理器= 1,和posting_date = 2010-03-10 residual_data表。

INSERT INTO `residual_data`(processor,posting_date) VALUES ('1','2010-03-10'); 

我得到一個:

[錯誤] 1452 - 不能添加或更新子行,外鍵約束失敗(residual_data,約束residual_data_ibfk_1外鍵(processorposting_date)參考文獻residual_reportsprocessorposting_date)ON UPDATE CASCADE)

已確認值在父表中確實存在,但仍然會獲得外鍵約束錯誤。有什麼我錯過了複合外鍵?

+0

好的,所以它必須如此與ENUM數據類型。我把它切換到TINYINT,它工作正常。任何人都知道有關外鍵和ENUM類型數據的任何文檔可以支持這一點? – Jestep 2010-03-10 17:24:07

回答

2

我會懷疑ENUM的,之後你有做過什麼嗎?你是否改變了價值觀?

+0

我認爲你是對的。我將數據類型切換到tinyint,它工作正常。 – Jestep 2010-03-10 17:30:17

0

您的代碼原樣爲我工作。是否有可能對residual_reports的更改尚未提交?

0

你用什麼版本的Mysql?看起來他們之前有類似的問題,枚舉值 http://bugs.mysql.com/bug.php?id=24985

+0

5.1.41。字符集是latin1,這不是主鍵,所以我不認爲這個錯誤適用。不知道這是否是一個錯誤,或不。雖然我找不到引用文檔中的枚舉外鍵。 – Jestep 2010-03-10 18:13:59