【问题标题】:Unable to add foreign key constraint after changing char set更改字符集后无法添加外键约束
【发布时间】:2018-11-05 16:50:13
【问题描述】:

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

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。怎么加回来?

【问题讨论】:

    标签: mysql sql database foreign-keys


    【解决方案1】:

    注意下面的粗体点,取自MySQL Docs

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

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

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

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

    因此,users 表中id 字段的字符集和排序规则应分别为utf8mb4utf8mb4_bin。我假设id 列的数据类型是VARCHAR(32)。您可以相应地更改它:

    ALTER TABLE users 
    MODIFY id VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
    

    【讨论】:

    • 这是 mysql 还是 sql,我收到语法错误 'unexpect SET (set)
    • @Kyle 您还需要添加数据类型。 id 列的当前数据类型是什么
    • 我觉得我正在经历一些变化,但这给了我错误Cannot change column 'id': used in a foreign key constraint 'api_keys_ibfk_1' of table 'test_database.api_keys'
    • @Kyle 好吧,现在这绝对是个兔子洞。您必须检查该列所引用的字段
    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2020-09-12
    • 2017-07-16
    • 2013-03-10
    • 2021-11-05
    • 2018-02-13
    相关资源
    最近更新 更多