我在InnoDB中有一个表,它使用基于VARCHAR的ForeignKey:
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列的长度,所以我做了。现在,每当我想从“portal_equity”表中引用isin超过原始长度12的行时,我就会一直收到以下完整性错误。
表
investtor
的外键约束失败。portal_equitypastvalue
: 约束equity_id_refs_isin_7eed44e7
外键(equity_id
)参考portal_equity
(isin
) 尝试在索引portal_equitypastvalue_equity_id_6e7526e1
元组中添加子表: DATA TUPLE:3个字段; 0:len 12; hex 304c55303332333133343030; asc 0LU032313400 ;; 1:len 3; hex 8fb578; asc x ;; 2:len 4; hex 8001398a; asc 9 ;;但是在父表
investtor
。portal_equity
中,在索引PRIMARY
中,我们可以找到的最接近的匹配是记录: 物理记录:n_fields 9;紧凑格式;信息位0 0:len 13; hex 304c5530333233313334303036; asc 0LU0323134006 ;; 1:len 6; hex 000000005139; asc Q9 ;; 2:len 7; hex 800000002d0110; asc - ;; 3:len 4; hex 61736466; asc asdf ;; 4:len 4; hex 80000050; asc P ;; 5:len 3; hex 736466; asc sdf ;; 6:len 4; hex 80000001; asc ;; 7:len 2; hex 4144; asc AD ;; 8:len 0;十六进制asc ;;
我是否需要重新生成所有外键约束?这似乎相当过分。这个行为/错误是否记录在某处?
答案 0 :(得分:1)
我是否需要重新生成所有外键约束?
是
这似乎相当过分。
如果更改主键字段的数据类型,我自然认为您还需要更改外键字段的数据类型(及其各自的索引和约束)。
虽然documentation状态'字符串类型的长度不必相同',但逻辑意义上规定外键字段至少应该与您想要存储在其中的任何数据一样长。
祝你好运!