外键约束是否错误形成?

时间:2012-04-09 18:48:03

标签: mysql

创建表时我得到了这个错误:外键约束形成错误???

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

感谢您的帮助!

6 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:7)

还要确保两个表都是innoDB。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

在引用的表中,我将ascii作为默认字符集:DEFAULT CHARSET=ascii报告了show create table。我试图用DEFAULT CHARSET=utf创建引用表,我得到'外键约束不正确'。

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

答案 4 :(得分:1)

发生此问题是因为列

`Note_ID` int(11) UNSIGNED NOT NULL

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

只是做到了

`Note_ID` int(11) UNSIGNED NOT NULL UNIQUE

它会起作用。

答案 5 :(得分:0)

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

相关问题