创建表时我得到了这个错误:外键约束形成错误???
{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
}
感谢您的帮助!
答案 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
时,我遇到了同样的问题。不知道为什么一张表上的排序规则发生了变化,但解决这个问题解决了问题。