mysql - 在mysql中添加char类型的外键

标签 mysql char foreign-keys column-types

我在 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 - Cannot add foreign key constraint

根据一些研究和测试,我得出的结论是 CHAR(即 production_x_countrycountry field) is no valid foreign key field type - 虽然我没有在 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,但这对我来说并不令人满意)?最重要的是:有什么解释吗

谢谢你的帮助!


已解决 - 请参阅下面我自己的答案

最佳答案

解决了! 这不是关于 char 字段类型,而是关于 collat​​ion!

我主要喜欢使用 UTF-8 utf8_bin。我对主键的整理也是如此:

`iso_3166_1` char(3) CHARACTER SET utf8

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

关于mysql - 在mysql中添加char类型的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27184211/

相关文章:

mysql - 起草 SQL 搜索条目以检查变量是否在表上的值范围内

mysql - 相当于 MySQL UTC_DATE() 的最快 postgreSQL(获取 UTC 日期)?

c - 奇怪的错误,将 char 与字符串进行比较 (p == "cancel")

MySQL:使用 char(n) 与带有零填充的十进制(n)

c# - 如何在 foreach 循环中为 char 变量赋值? C#

java - 使用 PostgreSQL,为什么 Hibernate/JPA 不创建级联约束?

mysql - 无法处理MYSQL函数中的异常

mysql - 错误1005(HY000): Can't create table 'CBDB.Subsystem' (errno: 150)

django - 获取模型外键名称和值?

php - 如何避免用户提交的MySQL数据库存储重复内容