MySQL添加外键Foreign Keys出错,报错[HY000][3780]

今天写开发文档的时候需要做一下数据结构相关的内容,于是就想着一个快捷一点儿的操作,直接在DataGrip里面调用视图,然后将视图打印为PDF,这样就可以直接截图获取到图片了。由于开发的过程中也没有怎么注重外键的建立,因为本来就是一个小小的比赛,所以生成视图的时候外键联系的箭头都没有,真的是自闭了,如果这个直接给评委看,评委估计会气哭。。。所以我打算花点时间加一些外键上去,心里想着也花不了多少时间,谁知道,这下子还遇到一些哲学问题!

首先看下,本来数据库表视图是这样的,我只是想多增加一些外键约束,让它看起来更加的专业一点儿,而不是一个像小学生做的数据库似的。

接下来设置外键的过程(park_detail中的scenic_id是外键,scenic_info中的scenic_id是主键)就很牛逼了,直接就遇到了这样的提示:

[HY000][3780] Referencing column ‘scenic_id‘ and referenced column ‘scenic_id‘ in foreign key constraint ‘park_detail_scenic_info_scenic_id_fk‘ are incompatible.

这个问题出现的时候,我发动我四级英文阅读能力(好吧其实六级也过了,只是六级擦边。。),可以看出MySQL提示外键与引用的列不兼容。我想的是可能park_detail中的scenic_id没有带有非空约束,而scenic_info中的scenic_id是肯定有非空约束的,所以聪明的我又去查看了它们两个数据项的约束条件是否一致。

下面两幅图分别是这两个数据项的约束条件,可以看出都是设置了非空约束,但就是不能成功的设置外键,我已经抓狂了快。

我直接把整个错误copy到百度,看到有人说有可能是字符集的问题,这句话点醒了我,所以我用MySQL的mysqldump工具把这两个表导出到了桌面

然后去观察这两个sql文件内是怎么对字符集编码进行规定的

可以看出来,这两个表内的字符集规定并不是完全一样,那么接下来就以scenic_info这个表作为基准,去更改park_detail的字符集问题。

ALTER TABLE park_detail CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

上面的代码是更改的表结构的编码,也可以自己写代码直接更改字段的编码,不过我还没有试,此类更改字符集的教程也是比较的多。

列举几个比较常用的:

修改已存在列的collate属性,需要使用下面的语法

alter table tbl_name MODIFY col_name column_definition CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name

修改表的默认字符集

ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE…];

把表的默认字符集和所有的字符列都更改为新的字符集

ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

修改字段的字符集

ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE …];

如果创建数据库的时候没有进行指定,以系统自己的字符设置为准,这里说的系统是运行的MySQL,估计是因为我的电脑重装了,导致前后两次备份的数据库内字符集就变混乱了,不过现在掌握了怎么更改字符集,还怕什么?下面就是我更改成功之后,添加了外键的效果

不一定只有系统遇到外键错误时才会报错[HY000][3780],有可能同样是因为字符集不一样的问题报这个错误。

原文地址:https://www.cnblogs.com/mirage-mc/p/12627148.html

时间: 2024-12-17 05:21:04

MySQL添加外键Foreign Keys出错,报错[HY000][3780]的相关文章

mysql为表添加外键完成性约束 报错Can't create table 'sfkbbs.#sql-513_25' (errno: 150)

代码 alter table sfk_son_module add constraint foreign key(father_module_id) references sfk_father_module(id) on delete restrict on update restrict; (constraint 后面可以加上约束名字) 错误原因是之前两张表的id的类型不一样,一个时int,一个时bigint 解决办法时修改表, alter table sfk_father_module mo

MYSQL 添加外键报错

2014年6月16日 10:48:51 出错的部分提示摘录: #1452 - Cannot add or update a child row: a foreign key constraint fails result 2 when explaining filename '#sql-3d5_204369' 解决办法: pma 中同时执行两条语句: set foreign_key_checks = 0; ALTER TABLE `table_name` ADD CONSTRAINT `fk_n

MySQL添加外键的方法

为book表添加外键: <1>明确指定外键的名称: 语法:alter table 表名 add constraint 外键的名称 foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名); alter table book add constraint FK_BOOK foreign key(pubid) references pub_com(id) on delete restrict on update restrict; <2>不指定外

mysql添加外键

为已经添加好的数据表添加外键: 语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名); 例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id) //FK_ID是外键的名称 /* CREATE TABLE `tb_active` (  `id` int(1

Mysql添加外键约束

简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号(user_id) 把设备表中的用户编号设置成外键,引用用户表的主键. 当向设备表中输入数据时,如果输入用户编号在用户表中找不到对应的话,就会报错,从而能保证这个设备必定会属于一个存在的用户. 2.可以实现级联删除 还引用上面的例子,当一个用户不在使用该系统时,需要将用户和他的设备从数据库删除,如果

MYSQL添加外键关联

SELECT * from stu st,course co,score sc where st.sid = sc.sid and sc.cid = co.cid 如果我们要给 sid 做一个约束,即两张表中的 sid 要一一对应,所以我们要添加外键 score 关联 stu: 此时,更改score 中 sid 的值,因为此处的sid 必须与 stu 中的sid对应,stu 中没有 sid= 1008,所以这个时候更改score中的sid = 1008 ,保存的时候会提示报错 ? ? 原文地址:

MySQL truncate含有外键约束的条目报错

1.报错信息: Cannot truncate a table referenced in a foreign key constraint 2.出现错误操作: truncate table a1; 为什么使用truncate? 使用truncate可以清空表数据,而且可以使自增列重置. 3.解决方法 在MySQL中取消外键约束:set foreign_key_checks=0; 执行truncate table a1; 之后在设置外键约束:set foreign_key_checks=1; 原

mysql添加外键失败解决方案

mysql重启命令: Redirecting to /bin/systemctl stop  mysqld.service[[email protected] centOS7Share]# systemctl start mysqld.service[[email protected] centOS7Share]# mysql -uroot -proot123 mysql运行sql文件:source /mnt/hgfs/XXX.sql; 初始化sql运行导致的外键关联失败: :35:31.428

mysql添加外键失败

今天对已存在的两个表中的一个表添加另一个表的主键为外键,遇到以下错误: Cannot add or update a child row:a foreign key constraint fails 原因: 设置的外键和对应的另一个表的主键值不匹配. 解决方法: 找出不匹配的值修改. 或者清空两表数据. 原文地址:https://www.cnblogs.com/tanzq/p/8519575.html