2010-11-24 34 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