mysql?升級(jí)過(guò)程中的mysqlCannotaddforeignkeyconstraint錯(cuò)誤怎么解決

本篇內(nèi)容介紹了“MySQL升級(jí)過(guò)程中的mysql Cannot add foreign key constraint錯(cuò)誤怎么解決”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)長(zhǎng)期為千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為屯溪企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,屯溪網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

背景

升級(jí)過(guò)程中如果遇到mysql Cannot add foreign key constraint的錯(cuò)誤該怎么處理
其中:
mlflow 從1.4.0升級(jí)到1.11.0
mysql版本 5.7.21-log
遇到如下問(wèn)題:

(mlflow-1.11.0) ?  mlflow db upgrade mysql://root:root@localhost/mlflow-online

2020/11/04 14:20:13 INFO mlflow.store.db.utils: Updating database tables
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 0a8213491aaa -> 728d730b5ebd, add registered model tags table
Traceback (most recent call last):
  File "/Users/ljh/opt/miniconda3/envs/mlflow-1.11.0/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1246, in _execute_context
    cursor, statement, parameters, context
  File "/Users/ljh/opt/miniconda3/envs/mlflow-1.11.0/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 588, in do_execute
    cursor.execute(statement, parameters)
  File "/Users/ljh/opt/miniconda3/envs/mlflow-1.11.0/lib/python3.6/site-packages/MySQLdb/cursors.py", line 206, in execute
    res = self._query(query)
  File "/Users/ljh/opt/miniconda3/envs/mlflow-1.11.0/lib/python3.6/site-packages/MySQLdb/cursors.py", line 319, in _query
    db.query(q)
  File "/Users/ljh/opt/miniconda3/envs/mlflow-1.11.0/lib/python3.6/site-packages/MySQLdb/connections.py", line 259, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.IntegrityError: (1215, 'Cannot add foreign key constraint')
...
sqlalchemy.exc.IntegrityError: (MySQLdb._exceptions.IntegrityError) (1215, '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
)

問(wèn)題分析

我們直接把以上的CREATE TABLE registered_model_tags 語(yǔ)句復(fù)制到mysql的客戶端執(zhí)行,發(fā)現(xiàn)也是Cannot add foreign key constraint錯(cuò)誤,
繼續(xù)執(zhí)行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 外鍵限制:字段的類型必須一致,可是發(fā)現(xiàn)字段類型也是一樣的,
重點(diǎn): mysql字段字符集和校驗(yàn)集也必須要一致

原來(lái)是我創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候選擇的數(shù)據(jù)集是utf8,校驗(yàn)集是utf8_bin,而看看我們數(shù)據(jù)庫(kù)中表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數(shù)據(jù)集也是utf8,為啥還會(huì)出問(wèn)題呢,這個(gè)時(shí)候我們就得補(bǔ)充幾個(gè)知識(shí)點(diǎn)了:

1. mysql中CHARSET和COLLATE的繼承順序
如果庫(kù)級(jí)別沒(méi)有設(shè)置CHARSET和COLLATE,則庫(kù)級(jí)別默認(rèn)的CHARSET和COLLATE使用實(shí)例級(jí)別的設(shè)置
如果表級(jí)別沒(méi)有設(shè)置CHARSET和COLLATE,則表級(jí)別會(huì)繼承庫(kù)級(jí)別的CHARSET與COLLATE
如果列級(jí)別沒(méi)有設(shè)置CHARSET和COLLATE,則列級(jí)別會(huì)繼承表級(jí)別的CHARSET與COLLATE
2. mysql中CHARSET和COLLATE優(yōu)先級(jí)
如果表指定了CHARSET和COLLATE,就采用該CHARSET和COLLATE
如果表指定了CHARSET,但是沒(méi)有指定COLLATE,那么COLLATE采用CHARSET默認(rèn)的COLLATE

我看看在mysql 5.7.21中uft8默認(rèn)的COLLATE 是什么, 在mysql客戶端執(zhí)行 show collation;
mysql?升級(jí)過(guò)程中的mysql Cannot add foreign key constraint錯(cuò)誤怎么解決

可以看到默認(rèn)的是utf8_general_ci
所以registered_models表中 CHARSET 為utf8,COLLATE 為utf8_general_ci
而registered_model_tags中沒(méi)有指定CHARSET和COLLATE,所以繼承自數(shù)據(jù)庫(kù)的CHARSET和COLLATE,分別為utf8和utf8_bin

所以就會(huì)出現(xiàn)以上的Cannot add foreign key constraint 問(wèn)題

解決

把數(shù)據(jù)庫(kù)的COLLATE改成utf8_general_ci就能解決

“mysql升級(jí)過(guò)程中的mysql Cannot add foreign key constraint錯(cuò)誤怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站題目:mysql?升級(jí)過(guò)程中的mysqlCannotaddforeignkeyconstraint錯(cuò)誤怎么解決
URL鏈接:http://bm7419.com/article44/ipoeee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司自適應(yīng)網(wǎng)站外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)