mysql 外键约束的格式不正确?

58wvjzkj  于 2023-01-08  发布在  Mysql
关注(0)|答案(6)|浏览(199)

我得到这个错误时创建表:一个月一个月

create table comment(
Comment_ID int UNSIGNED AUTO_INCREMENT not null,
User_1 varchar(50) not null,
Note_ID int(11) UNSIGNED not null,
PRIMARY key(Comment_ID),
  CONSTRAINT `fk_1` FOREIGN KEY (`User_1`) REFERENCES `user` (`Dev_ID`),
  CONSTRAINT `fk_2` FOREIGN KEY (`User_2`) REFERENCES `user` (`Dev_ID`),
  CONSTRAINT `fk_3` FOREIGN KEY (`Note_ID`) REFERENCES `note`(`Note_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

删除fk_3就可以了。
这是我的笔记桌

CREATE TABLE `note` (
 `Dev_ID` varchar(50) NOT NULL,
  `Note_ID` int(11) UNSIGNED NOT NULL,
  `Title` varchar(200) NOT NULL,
  `Time` datetime NOT NULL,
  `Mood` int(11) NOT NULL,
  `Body` varchar(3000) NOT NULL,
  `Visible` tinyint(1) NOT NULL DEFAULT '1',
  `Share` tinyint(1) NOT NULL DEFAULT '0',
  `Update` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Dev_ID`,`Note_ID`),
  CONSTRAINT `fk_note_user` FOREIGN KEY (`Dev_ID`)
                       REFERENCES `user` (`Dev_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

多谢帮忙!

z9smfwbn

z9smfwbn1#

这是因为note表的主键是(Dev_ID,Note_ID),但您在约束中只引用了其中一列(Note_ID)。
FK约束必须始终由所有PK列组成。

yuvru6vn

yuvru6vn2#

还要确保两个表都是inoDB。

piok6c0g

piok6c0g3#

除了已给出的答案之外,如果字段类型不匹配,也会出现此错误。例如,如果试图在varchar字段和int字段之间创建外键约束。

mrfwxfqh

mrfwxfqh4#

出现此问题的原因是

`Note_ID` int(11) UNSIGNED NOT NULL

既不是主要的也不是唯一的。
快做吧

`Note_ID` int(11) UNSIGNED NOT NULL UNIQUE

它会起作用的。

cnh2zyt3

cnh2zyt35#

还有一点:字段的字符集必须匹配。
在引用的表中,我使用ascii作为默认字符集:show create table报告了DEFAULT CHARSET=ascii。我尝试使用DEFAULT CHARSET=utf创建引用表,但收到“外键约束格式不正确”。
在新表(引用表)上将其更改为DEFAULT CHARSET=ascii之后,它就成功创建了。

b4lqfgs4

b4lqfgs46#

确保两个字段上的排序规则相同。当一个是latin-general-ci,另一个是utf8_unicode_ci时,我遇到了同样的问题。不确定为什么一个表上的排序规则发生了变化,但修复此问题解决了问题。

相关问题