更改字符集后无法添加外键约束

时间:2018-11-05 16:50:13

标签: mysql sql database foreign-keys

我有一个表,用于在应用程序中存储短信。我想添加使用表情符号的功能,但它们始终显示为? ? ? ?等...在数据库中。我了解到需要更改表的字符集,因此我运行了命令

ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

但我收到此错误:Error Code: 1832. Cannot change column 'user_id': used in a foreign key constraint 'posts_ibfk_2'

所以我放下了FK,然后运行了命令,一切正常。但是现在,当我尝试读取FK时,我不断收到1215错误,无法添加FK约束。

ALTER TABLE posts
ADD FOREIGN KEY (user_id)
REFERENCES users(id);

我尝试将字符集转换回原来的字符集,但仍然无法添加FK。如何将其重新添加?

1 个答案:

答案 0 :(得分:0)

请注意以下来自MySQL Docs的粗体字:

  

外键关系涉及一个父表,该表包含   中央数据值,以及具有相同值的子表   回到其父辈。在子级中指定FOREIGN KEY子句   表。 父表和子表必须使用相同的存储引擎

     

外键和引用键中的相应列必须   具有相似的数据类型。整数类型的大小和符号必须为   相同。字符串类型的长度不必相同。 对于   非二进制(字符)字符串列,字符集和排序规则   必须相同。

     

当启用foreign_key_checks(默认设置)时,   包含以下字符的表不允许进行字符集转换   外键约束中使用的字符串列。

基本上,在更改子表中 referencing 字段的字符集和排序规则之后;它与父表中所引用字段的字符集和排序规则不匹配。您需要确保它们都匹配。

因此,414表中id字段的字符集和排序规则应分别为usersutf8mb4。假设utf8mb4_bin列的数据类型为id。您可以相应地对其进行更改:

VARCHAR(32)