mysql​升级过程中的mysql Cannot add foreign key constraint错误怎么解决

技术mysql​升级过程中的mysql Cannot add foreign key constraint错误怎么解决本篇内容介绍了“mysql升级过程中的mysql Cannot add foreign key con

本篇内容介绍了“mysql升级过程中的关系型数据库无法添加外键约束错误怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

背景

升级过程中如果遇到关系型数据库无法添加外键约束的错误该怎么处理

其中:

mlflow从1.4.0升级到1.11.0

关系型数据库版本5.7.21日志

遇到如下问题:

(mlflow-1。11 .0)mlflow dbupgrademysql ://root : root @ localhost/mlflow-online

2020/11/0414:20:13 infoomlflow。商店。db。utils :更新数据库表

INFO[alembic。运行时。迁移]ContextimplMySQLImpl .

INFO[alembic。运行时。迁移]将组装非事务性dl .

INFO[alembic。运行时。迁移]正在运行gupgrade0a 8213491 aa-728d 730 b5 EBD,addregisteredmodeltagstable

追溯(mostrencetcall最后):

文件'/Users/ljh/opt/mini conda 3/envs/mlflow-1。11 .0/lib/python 3.6/站点包/sqlalchemy/engine/base。py ',line1246,在_execute_context中

游标、语句、参数、上下文

文件/Users/ljh/opt/mini conda 3/envs/mlflow-1。11 .0/lib/python 3.6/site-packages/sqlalchemy/engine/默认值。py ',第588行,indo_execute

cursor.execute(语句、参数)

文件/Users/ljh/opt/mini conda 3/envs/mlflow-1。11 .0/lib/python 3.6/site-packages/MySQL/游标。py ',第206行,不精确

res=self ._查询(查询)

文件'/Users/ljh/opt/mini conda 3/envs/mlflow-1。11 .0/lib/python 3.6/site-packages/MySQL/游标。' py ',第319行,in_query

db.query(q)

文件'/Users/ljh/opt/mini conda 3/envs/mlflow-1。11 .0/lib/python 3.6/site-packages/MySQL/connections。py ',第259行,在查询中

_mysql.connection.query(self,query)

MySQLdb ._例外IntegrityError:(1215,“Cannotaddforeignkeyconstraint”)

.

sqlalchemy。exc。integrityerror :(MySQL ._例外。完整性错误(121)

5, 'Cannot add foreign key constraint')
[SQL:
CREATE TABLE registered_model_tags (
`key` VARCHAR(250) NOT NULL,
value VARCHAR(5000),
name VARCHAR(256) NOT NULL,
CONSTRAINT registered_model_tag_pk PRIMARY KEY (`key`, name),
FOREIGN KEY(name) REFERENCES registered_models (name) ON UPDATE cascade
)

问题分析

我们直接把以上的CREATE TABLE registered_model_tags 语句复制到mysql的客户端执行,发现也是Cannot add foreign key constraint错误,
继续执行SHOW ENGINE INNODB STATUS 截取Status字段中一部分:

2020-11-04 11:34:18 0x700004a77000 Error in foreign key constraint of table mlflow@002donline/registered_model_tags:
FOREIGN KEY(name) REFERENCES registered_models (name) ON UPDATE cascade
):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html for correct foreign key definition.

可以看到是建立registered_model_tags 外键限制:字段的类型必须一致,可是发现字段类型也是一样的,
重点: mysql字段字符集和校验集也必须要一致

原来是我创建数据库的时候选择的数据集是utf8,校验集是utf8_bin,而看看我们数据库中表registered_models的DDL:

CREATE TABLE `registered_models` (
 `name` varchar(256) NOT NULL,
 `creation_time` bigint(20) DEFAULT NULL,
 `last_updated_time` bigint(20) DEFAULT NULL,
 `description` varchar(5000) DEFAULT NULL,
 PRIMARY KEY (`name`),
 UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

可是表registered_models数据集也是utf8,为啥还会出问题呢,这个时候我们就得补充几个知识点了:

1. mysql中CHARSET和COLLATE的继承顺序
如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置
如果表级别没有设置CHARSET和COLLATE,则表级别会继承库级别的CHARSET与COLLATE
如果列级别没有设置CHARSET和COLLATE,则列级别会继承表级别的CHARSET与COLLATE
2. mysql中CHARSET和COLLATE优先级
如果表指定了CHARSET和COLLATE,就采用该CHARSET和COLLATE
如果表指定了CHARSET,但是没有指定COLLATE,那么COLLATE采用CHARSET默认的COLLATE

我看看在mysql 5.7.21中uft8默认的COLLATE 是什么, 在mysql客户端执行 show collation;
mysql​升级过程中的mysql Cannot add foreign key constraint错误怎么解决

可以看到默认的是utf8_general_ci
所以registered_models表中 CHARSET 为utf8,COLLATE 为utf8_general_ci
而registered_model_tags中没有指定CHARSET和COLLATE,所以继承自数据库的CHARSET和COLLATE,分别为utf8和utf8_bin

所以就会出现以上的Cannot add foreign key constraint 问题

解决

把数据库的COLLATE改成utf8_general_ci就能解决

“mysql升级过程中的mysql Cannot add foreign key constraint错误怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133549.html

(0)

相关推荐

  • java线程相关知识点有哪些

    技术java线程相关知识点有哪些这篇文章主要讲解了“java线程相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java线程相关知识点有哪些”吧!cas c

    攻略 2021年11月24日
  • 代理HTTP和HTTPS协议有什么区别

    技术代理HTTP和HTTPS协议有什么区别这篇文章将为大家详细讲解有关代理HTTP和HTTPS协议有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。大家经常见的HT

    攻略 2021年10月21日
  • 臀大肌锻炼方法,臀部肌肉缕缩要做什么锻炼

    技术臀大肌锻炼方法,臀部肌肉缕缩要做什么锻炼臀大肌位于臀部臀大肌锻炼方法,被认为是人体最强壮的肌肉之一。它连接到尾骨或尾骨,以及其他周围的骨骼。臀大肌负责臀部和大腿的运动。下面是五种非常有效的锻炼臀部肌肉的方法,希望对您

    生活 2021年10月24日
  • Act Framework多模块开发指南是什么

    技术Act Framework多模块开发指南是什么这篇文章给大家介绍Act Framework多模块开发指南是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ActFramework 是一个Jav

    攻略 2021年10月20日
  • 如何打麻将,打麻将怎么才能提高胜算

    技术如何打麻将,打麻将怎么才能提高胜算麻将这种棋牌游戏简单易学,四个人你来我往互不相让,争得不亦乐乎。殊不知正是是因为“简单易学”这四个字让很多人陷入了“易学难精”的尴尬境地,至于提高胜算更是可望而不可及。那么,真正能提

    生活 2021年10月23日
  • 通过抓包实现Python模拟登陆各网站的原理分析是怎样的

    技术通过抓包实现Python模拟登陆各网站的原理分析是怎样的这篇文章将为大家详细讲解有关通过抓包实现Python模拟登陆各网站的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相

    攻略 2021年12月4日