2010-11-24 33 views
1

我在InnoDB的一個表,它使用基於VARCHAR ForeignKey的:InnoDB的:改變的長度的VARCHAR主密鑰

CREATE TABLE `portal_equity` (
    `isin` varchar(12) NOT NULL, 
    ...., 
    PRIMARY KEY (`isin`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

另一個表具有一個ForeignKey約束到該表:

CONSTRAINT `equity_id_refs_isin_2581bb1d` FOREIGN KEY (`equity_id`) REFERENCES `portal_equity` (`isin`) 

我需要改變主鍵VARCHAR列的長度,所以我做了。現在,我一直在ISIN超過12

外鍵約束的原始長度爲失敗表investtor我想從「portal_equity」引用表中的一行,每次得到以下完整性錯誤。 portal_equitypastvalue: 約束equity_id_refs_isin_7eed44e7外鍵(equity_id)參考文獻portal_equityisin) 試圖在子表添加,在索引portal_equitypastvalue_equity_id_6e7526e1元組: 數據元組:3個字段; 0:len 12;六角304c55303332333133343030; asc 0LU032313400 ;; 1:len 3;十六進制8fb578; asc x ;; 2:len 4;六角形8001398a; asc 9 ;;

但在父母表investtorportal_equity,在索引PRIMARY,我們可以找到最接近的匹配是記錄: 物理記錄:n_fields 9;緊湊格式; info bits 0 0:len 13;六角304c5530333233313334303036; asc 0LU0323134006 ;; 1:len 6;十六進制000000005139; asc Q9 ;; 2:len 7;十六進制800000002d0110; asc - ;; 3:len 4;六角61736466; asc asdf ;; 4:len 4;十六進制80000050; asc P ;; 5:len 3; hex 736466; asc sdf ;; 6:len 4;六角形80000001; asc ;; 7:len 2;六角4144; asc AD ;; 8:len 0;十六進制asc ;;

我是否需要重新生成所有外鍵限制?這似乎相當過分。這種行爲/錯誤記錄在某處?

回答

1

我是否需要重新生成所有外鍵限制?

是的。

這似乎相當過分。

如果您更改主鍵字段的數據類型,那麼對於我來說外鍵字段(及其各自的索引和約束)的數據類型也需要更改似乎很自然。

雖然documentation指出'字符串類型的長度不需要相同',但邏輯意義上指出外鍵字段至少應與您要存儲在其中的任何數據一樣長。

祝你好運!

+0

實際上,FOREIGN KEY約束本身並不需要更新。相反,那些存儲主鍵的子表中的實際字段仍然具有舊的長度,這是我完全錯過的,這是一種愚蠢的行爲。我將ORM部分歸咎於ORM,它會自動創建這些外鍵字段,並使它們遠離我的視線。 – miracle2k 2010-11-27 21:40:35