【问题标题】:Adding foreign key of type char in mysql在mysql中添加char类型的外键
【发布时间】:2015-01-26 20:24:44
【问题描述】:

我在 mysql 中添加外键时遇到问题(使用 phpmyadmin)。

ALTER TABLE `production_x_country` ADD  FOREIGN KEY (`country`) REFERENCES `pmdb_0.3.12`.`countries`(`iso_3166_1`) ON DELETE CASCADE ON UPDATE CASCADE;

#1215 - 无法添加外键约束

根据一些研究和测试,我得出的结论是 CHAR(production_x_country.country 字段)不是有效的外键字段类型 strong> - 尽管我在 mysql 文档中没有找到任何关于该假设的提示。 如果我将列类型更改为 VARCHAR 等其他字符类型,则该过程有效。

一个类似的问题在这里“解决”了,但链接的答案不是关于类型问题,而是关于作为主键的国家代码(是什么让对我来说很完美):https://stackoverflow.com/a/1419235/4302731


表格说明:

CREATE TABLE IF NOT EXISTS `countries` (
  `iso_3166_1` char(3) NOT NULL,  <----- primary key to be referenced to
  `name` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `countries` ADD PRIMARY KEY (`iso_3166_1`);



CREATE TABLE IF NOT EXISTS `production_x_country` (
  `production` int(11) NOT NULL,
  `country` char(3) CHARACTER SET utf8 NOT NULL   <----- column that should hold the foreign key
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

是否有任何解决方案(是的,我可以继续使用 varchar,但这对我来说并不令人满意)?最重要的是:有什么解释?

感谢您的帮助!


已解决 - 请在下方查看我自己的答案

【问题讨论】:

    标签: mysql char foreign-keys column-types


    【解决方案1】:

    解决了! 这不是关于 char 字段类型,而是关于 排序规则!

    我喜欢使用 UTF-8,主要是 utf8_bin。我的主键排序规则也是如此:

    `iso_3166_1` char(3) CHARACTER SET utf8
    

    一旦我将主键的排序规则更改为“latin1_swedish_ci”,外键应用程序就会工作。 引出了一个问题:为什么主键字段(可能还有外键字段,还没有检查)的排序规则很重要?

    【讨论】:

    • 伙计,你拯救了我的一天。有同样的问题,完全忘记了排序规则!
    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2015-03-14
    • 2011-08-11
    • 2021-11-12
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多