15

创建表时出现此错误:外键约束形成错误???

{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
}

感谢帮助!

4

6 回答 6

24

这是因为notes表的主键是,(Dev_ID,Note_ID)但您只Note_ID在约束中引用其中一列 ( )。

FK 约束必须始终包含所有 PK 列。

于 2012-04-09T18:55:21.437 回答
12

还要确保两个表都是 innoDB。

于 2015-09-15T12:34:51.320 回答
3

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

于 2015-02-27T14:25:39.707 回答
3

出现此问题是因为列

`Note_ID` int(11) UNSIGNED NOT NULL

既不是主要的也不是唯一的。

做吧

`Note_ID` int(11) UNSIGNED NOT NULL UNIQUE

它会起作用。

于 2018-03-06T10:47:24.143 回答
1

另一个补充:字段的字符集必须匹配。

在引用的表中,我将 ascii 作为默认字符集:DEFAULT CHARSET=asciishow create table. 我尝试使用创建引用表,DEFAULT CHARSET=utf但得到“外键约束格式不正确”。

在我将其更改DEFAULT CHARSET=ascii为新表(引用表)后,它已成功创建。

于 2017-04-16T16:56:55.637 回答
0

确保两个字段的排序规则相同。latin-general-ci当一个是,另一个是时,我遇到了同样的问题utf8_unicode_ci。不知道为什么排序规则在一张桌子上发生了变化,但解决了这个问题。

于 2021-07-08T08:32:13.843 回答