【问题标题】:InnoDB: Changing the length of a VARCHAR primary KeyInnoDB:更改 VARCHAR 主键的长度
【发布时间】:2010-11-24 20:20:37
【问题描述】:

我在 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 元组中添加子表: 数据元组:3个字段; 0:长度 12;十六进制 304c55303332333133343030; asc 0LU032313400;; 1:长度 3;十六进制 8fb578;升 x;; 2:长度 4;十六进制 8001398a; asc 9 ;;

但是在父表investtor.portal_equity中,在索引PRIMARY中,我们能找到的最接近的匹配是记录: 物理记录:n_fields 9;紧凑的格式;信息位 0 0:长度 13;十六进制 304c5530333233313334303036; asc 0LU0323134006;; 1:长度 6;十六进制 000000005139;升Q9;; 2:长度 7;十六进制 800000002d0110;升序 - ;; 3:长度 4;十六进制 61736466;升序自卫队;; 4:长度 4;十六进制 80000050;升序 P;; 5:长度 3;十六进制 736466;升序自卫队;; 6:长度 4;十六进制 80000001;升序;; 7:长度 2;十六进制 4144;升序广告;; 8:长度 0;十六进制;升序;;

我需要重新生成所有外键约束吗?这似乎有点过分了。这种行为/错误是否记录在某处?

【问题讨论】:

    标签: mysql foreign-keys innodb varchar


    【解决方案1】:

    我需要重新生成所有外键约束吗?

    是的。

    这似乎有点过分了。

    如果您更改主键字段的数据类型,我认为您很自然地也需要更改外键字段的数据类型(以及它们各自的索引和约束)。

    尽管documentation 声明“字符串类型的长度不必相同”,但从逻辑上讲,外键字段至少应与您要在其中存储的任何数据一样长。

    祝你好运!

    【讨论】:

    • 其实 FOREIGN KEY 约束本身并不需要更新。相反,那些存储主键的子表中的实际字段仍然具有旧的长度,这是我完全错过的,这有点愚蠢。我部分归咎于 ORM,它会自动创建这些外键字段并让它们远离我的视线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2012-02-08
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多