cannot add foreign key constraint mysql_解决1215 - cannot add foreign key constraint

news/2024/7/5 11:29:37

1215 - cannot add foreign key constraint发生在为数据表添加外键时,一旦发生,还是挺痛苦的。在此,参考相关文章及本人经验做一下总结:

情况一:数据表存储引擎不一致

5d98189cbe76eb8572daf78610dbf6f2.png

我们看到,只有InnoDB是支持外键的。这就要求在指定外键时,两张表的引擎都要保证是InnoDB。如果这两张表任意一张表的引擎不是InnoDB,那么都会报1215 - cannot add foreign key constraint错误。

解决方法:在navicat中我们这么查看。数据表->找到表->设计表

9fd385aa682d214b86601c6e57d82e55.png

两张表,都保证是InnoDb就可以了。

情况二:在父表中,相关的ID不存在

举个例子:

学生表 student

id

name

teacher_id

1

张喜硕

1

2

潘佳琦

3

教师表teacher

id

name

1

teacherPan

此时,如果我们把设置student表的teacher_id为外键,并指向teacher表中的id时,就会发生错误。原因是student表中teacher_id为3的值在teacher表中不存在。

解决方法:修改或删除在表teacher中不存在的teacher_id。这种错误往往会发生在对历史表的升级上。

情况三:两个字段的类型不一样

添加外键时要保证类型完全一样,不能一个是int,另一个是bigint。也不能一个是有符号的int,另一个是无符号的int。也不能一样长度为1, 另一个长度为2。在实际的使用中,这种情况会出现在类型与有无符号上。解决的方法也简单:将两个字段的类型、长度、有无符号设置一致了就行了。

情况四:即是外键,也是主键

比如我们把数据表中的某个字段设置为了主键,那么此主键是必然不能为null。此时,我们又设置其为外键。但在设置删除策略时,却不小把它设置为:删除时设置为null。则会发生上述异常。

39733f26faea4e8338b2e1d563464d3e.png

原因其实刚才已经阐述了:是主键,则数据必然不能为null,与我们设置的策略:外键对应的表中的数据删除时,将此数据设置为null冲突。解决方法:设置策略为No Action或Restrict,这两个值的意思一样,同为:在删除时检查约束,如果存在外键,则报约束性异常。

字段属性与删除时触发事件冲突

比如,我们设置删除时set null

61f2b36b4a07d696cad02d1a30517182.png

然后这个字段在本表的属性却为:

3fc2ee80a123c2cbbe9d3db0eaed474a.png

则也会发生1215 - cannot add foreign key constraint。原因相信大家也猜大了,如果我们这样设置了,一旦发生外键的删除操作,就要按我们的设置将此字段设置为null,但我们同时又设置了此字估不能为null。当然就会发生错误了。为了规避这个错误,mysql 会在设置外键时,发生1215 - cannot add foreign key constraint

参考


http://www.niftyadmin.cn/n/3142266.html

相关文章

html教程-明灯小站

讲解html基本语法很仔细 链接: http://www.mingtern.com/html/html-tutorial.html转载于:https://www.cnblogs.com/weijiangping/p/9358092.html

批量修改文件名后缀

1.建立一个文件.txt 2.在文档里面输入 ren *.jpg* *.png* 3..jpg 是未修改的,png是你要修改的后缀 4.输入完毕,把文件.txt的文件后缀改成bat 图片就会全部变成png 转载于:https://www.cnblogs.com/fengyuzhen34/p/10717008.html

react 组件连动效果_react 三级联动地区选择组件 有木有

项目里正好有一个import React, { Component } from react;import PropTypes from prop-types;import classNames from classnames;import Selector from ./selector;import Model from ../model/model;import * as API from ../constants/api;class Location extends Componen…

Redis的IO多路复用

一、linux的IO复用函数同一个线程内,多个描述符的IO操作,能够并发交替地顺序执行。epoll只提供三个函数:int epoll_create(int size); #创建epoll句柄int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);关联被监听的事件和…

python -- synonyms

1、安装synonyms 通过pip安装synonyms 需要先安装下 numpy、scikit-learn、scipy 直接使用pip极可能安装失败,这里推荐下载.whl文件进行安装 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应版本的文件 使用pip安装 pip install "a.whl" 若安装还…

高性能mysql 笔记_高性能Mysql笔记 — 优化

性能优化了解查询的整个生命周期,清楚每个阶段的时间消耗情况性能分析慢查询日志——服务器性能分析参考慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢查询日志查看慢查询是否打开、以及日志…

区块链文章链接

2019独角兽企业重金招聘Python工程师标准>>> 想把区块链文章从知乎转移到OSCHINA, OSCHINA每天有篇数限制, 更多的文章暂时请到知乎查看: https://www.zhihu.com/people/zxvf-73/posts 转载于:https://my.oschina.net/kingwjb/blo…

TCHAR和CHAR类型的互转,string 转lpcwstr

https://www.cnblogs.com/yuguangyuan/p/5955959.html 没有定义UNICODE,所以它里面的字符串就是简单用" "就行了,创建工程的时候包含了UNICODE定义,就必须对TCHAR和char进行转换。 void TcharToChar(const TCHAR * tchar, char * _…