Referencing column 'x' and referenced column 'x' in foreign key constraint 'x' are incompatible.解决方案

Referencing column 'x' and referenced column 'x' in foreign key constraint 'x' are incompatible.解决方案

第一步检查数据类型

参考https://www.cnblogs.com/jardeng/p/12899019.html
翻译意思是:外键约束“xx”中的引用列“xx”和引用列“xx”不兼容

说明两个表关联的列数据类型不一致,比如:varchar 与 int,或者 int无符号 与 int有符号,都不行,必须要一模一样才可以,修改完成后,就可以添加外键了。
20231205230926

第二步检查字符编码是否相同

导致原因:
1.主键与外键字段数据类型不一致,例如主键A 表 ID数据类型varchar2,外键B 表a_id 为int或别的类型.
2.主键与外键字段数据类型一致,这种情况让人摸不到头脑,其他是项目迁移引发的Mysql Charset/Collation 字符编码不一样会报错.
参考https://blog.csdn.net/u011148770/article/details/121539637
建完表可以查一下字符编码是否相同,然后备注到后面

SHOW FULL COLUMNS FROM category;#utf8mb3_general_ci

SHOW FULL COLUMNS FROM product;#utf8mb3_general_ci

SHOW FULL COLUMNS FROM orders;#utf8mb4_0900_ai_ci

SHOW FULL COLUMNS FROM user;#utf8mb4_0900_ai_ci

20231205230926

解决方案:
知道问题导致原因,接下来问题就好解决
直接在删除之前的表,然后在建表的时候后面加上

ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;
这个字符编码可以自行修改
关于怎么选择字符集,可以参考这篇文章:
https://blog.csdn.net/m0_64363449/article/details/132378994我这边复制过来了

最后,建表语句如下:

CREATE TABLE `user` (
  `uid` varchar(32) NOT NULL,  #用户编号
  `username` varchar(20) DEFAULT NULL,		#用户名
  `password` varchar(20) DEFAULT NULL,		#密码
  `name` varchar(20) DEFAULT NULL,			#昵称
  `email` varchar(30) DEFAULT NULL,			#电子邮箱
  `telephone` varchar(20) DEFAULT NULL,		#电话
  `birthday` date DEFAULT NULL,				#生日
  `sex` varchar(10) DEFAULT NULL,			#性别
  `state` int(11) DEFAULT 0,				#状态:0=未激活,1=已激活
  `code` varchar(64) DEFAULT NULL,			#激活码
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

字符集选择

​ 1、如果处理各种各样的文字,发布到不同语言国家地区,选择Unicode。,对mysql对号utf-8。

​ 2、只需中文,数据量很大,性能要求也高,选择gbk.。

​ 3、处理移动物联网业务,选utf8mb4

​ 建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。

服务器字符集设置

[mysqld]
...
character-set-server=utf8   #添加这条语句,可设置服务器端字符集。

mysql服务端重新启动后,这两个参数会改变为设定值。

| character_set_server     | utf8    
| character_set_database   | utf8

切换字符集

将一种编码的数据库转换为另一种编码的数据。

alter database dbname character set xxx; #只能对以后的数据有效,对之前的数据无效。基本不使用

常用转换数据库字符集方案

mysqldump -S /tmp/mysql.sock4 --default-character-set=utf8 -d test > /data/test-`date +%F`.sql #1、导出表结构而不导出数据
 
vim /data/test-`date +%F`.sql
DROP TABLE IF EXISTS `table10`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `table10` (
  `id` int(11) DEFAULT NULL,
  `names` char(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  #2、这里的CHARSET改为你想要修改的字符集
 
mysqldump -S /tmp/mysql.sock4 --extended-insert --no-create-info test > /data/test-data-`date +%F`.sql  #3、导出数据内容
 
vim /data/test-data-`date +%F`.sql
LOCK TABLES `table10` WRITE;
set names utf8;  #4、这一行是多加的,自己指定想要转换的字符集
INSERT INTO `table10` VALUES (1,'云中鹤');
UNLOCK TABLES;
 
mysql> create database if not exists test;  #5、创建数据库,存储转换后的数据
Query OK, 1 row affected, 0 warning (0.00 sec)
 
mysql -S /tmp/mysql.sock4 test < /data/test-`date +%F`.sql  #6、导入表结构
 
mysql -S /tmp/mysql.sock4 test < /data/test-data-2015-09-25.sql   #7、导入表数据

posted @ 2023-12-05 21:43  XiSoul  阅读(30)  评论(0编辑  收藏  举报