3780 - Referencing column ‘order_id‘ and referenced column ‘order_id‘ in foreign key constraint ‘t_o

本文介绍了如何在数据库中设置ENGINE=INNODB DEFAULT CHARSET=utf8,详细阐述了操作步骤,包括问题分析、配置方法及执行过程,最终确认操作成功。

一、操作步骤

1.问题原文
在这里插入图片描述

2.问题效果
在这里插入图片描述
3.加入
ENGINE=INNODB DEFAULT CHARSET=utf8;
4.执行
在这里插入图片描述
5.成功
在这里插入图片描述

# 普通文本型回答 您遇到的错误: ``` 3780 - Referencing column 'comment' and referenced column 'id' in foreign key constraint 'fk_reply_comment' are incompatible. ``` 意思是:**外键字段 `comment` 和它所引用的主表字段 `id` 类型不兼容**,无法建立外键约束。 --- ### ❌ 错误原因分析 虽然两个字段都是 `INT(11)`,但 **其中一个有 `UNSIGNED`,而另一个没有**,导致类型不匹配。 根据您的建表顺序: - 您之前创建的 `comment` 表中,`id` 是: ```sql id INT(11) PRIMARY KEY AUTO_INCREMENT ``` → 默认为 **有符号(signed)INT** 而您现在创建 `reply` 表时,`comment` 字段定义为: ```sql comment INT(11) UNSIGNED NOT NULL ``` → 是 **无符号(unsigned)INT** ❗ MySQL 要求外键引用的两列必须: - 数据类型完全相同(包括长度、符号性) - 编码、排序规则一致(如果是字符串) - 同属一个数据库 所以: > `UNSIGNED INT` ≠ `SIGNED INT` → **类型不兼容 → 报错 3780** --- ### ✅ 解决方案 #### ✅ 方法一:修改 `reply.comment` 为 **有符号 INT**(推荐) 让从表字段与主表 `comment.id` 类型完全一致: ```sql -- 修改后的 reply 表创建语句 CREATE TABLE reply ( id INT(11) PRIMARY KEY AUTO_INCREMENT, comment INT(11) NOT NULL, -- 去掉 UNSIGNED user INT(11) UNSIGNED NOT NULL, r_content TEXT, add_time DATETIME, CONSTRAINT fk_reply_comment FOREIGN KEY (comment) REFERENCES comment(id) ) ENGINE=InnoDB; ``` ✅ 此时 `comment INT(11)`(有符号) ↔ `comment.id INT(11)` 完全匹配,可成功建立外键。 --- #### ✅ 方法二:修改主表 `comment.id` 为 `UNSIGNED`(需重建表) 如果您希望所有 ID 都使用无符号以扩大正整数范围,可以重新创建 `comment` 表: ```sql -- 先删除原表(谨慎操作!建议备份数据) DROP TABLE comment; -- 重建 comment 表,id 使用 UNSIGNED CREATE TABLE comment ( id INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT, goods_id INT(11) UNSIGNED NOT NULL, user_id INT(11) UNSIGNED NOT NULL, content TEXT, add_time DATETIME ) ENGINE=InnoDB; ``` 然后再按原语句创建 `reply` 表即可: ```sql CREATE TABLE reply ( id INT(11) PRIMARY KEY AUTO_INCREMENT, comment INT(11) UNSIGNED NOT NULL, user INT(11) UNSIGNED NOT NULL, r_content TEXT, add_time DATETIME, CONSTRAINT fk_reply_comment FOREIGN KEY (comment) REFERENCES comment(id) ) ENGINE=InnoDB; ``` --- ### 🔍 如何检查字段类型是否匹配? 在 Navicat 中: 1. 右键 `comment` 表 → “设计表”; 2. 查看 `id` 字段是否勾选了“无符号(Unsigned)”; 3. 如果没勾选 → 说明是有符号 → 从表就不能加 `UNSIGNED`。 --- ### ✅ 最终推荐方案(安全 + 兼容) ```sql -- 确保 reply.comment 不加 UNSIGNED CREATE TABLE reply ( id INT(11) PRIMARY KEY AUTO_INCREMENT, comment INT(11) NOT NULL, user INT(11) UNSIGNED NOT NULL, r_content TEXT, add_time DATETIME, CONSTRAINT fk_reply_comment FOREIGN KEY (comment) REFERENCES comment(id) ) ENGINE=InnoDB; ``` 📌 只需去掉 `comment` 字段的 `UNSIGNED`,即可立即解决 `ERROR 3780`! --- 请将以上 SQL 在 Navicat 中运行,即可成功创建 `reply` 表。 如有其他问题,欢迎继续提问!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值