我试图将一个外键添加到列中,但是我收到了以下错误:
(错误:150"外键约束形成错误")
=> 我检查的内容是,列是否有不同的类型,但它们是相同的。
=>因此,来自tbl_user的权限是外键,应该引用tbl_userrights中的rights_id
=>代码,我用过:
ALTER TABLE tbl_user ADD CONSTRAINT FK_RIGHTS_ID FOREIGN KEY (rights) REFERENCES rights_id(id);
tbl_user:
# Name Typ Kollation Attribute Null Standard Extra
1 id int(11) No AUTO_INCREMENT
2 rights int(11) No
tbl_userrights:
# Name Typ Kollation Attribute Null Standard Extra
1 rights_id int(11) No AUTO_INCREMENT
2 rights varchar(50) No
答案 0 :(得分:1)
您的FOREIGN KEY
定义并不完全正确。模式是:
FOREIGN KEY (referencing_columns) REFERENCES referenced_table (referenced_columns)
所以你有REFERENCES rights_id(id)
,你应该实际使用
ALTER TABLE tbl_user
ADD CONSTRAINT FK_RIGHTS_ID
FOREIGN KEY (rights) REFERENCES tbl_userrights (rights_id)
有关语法选项的完整详细信息,请参阅the FOREIGN KEY
documentation syntax reference。
您检查数据类型是否匹配是正确的,这是一个常见错误(也常见的是尝试在引用的表存在之前创建FK或在引用的列上有索引),但这次它只是到语法。
答案 1 :(得分:1)
外键约束引用的列应该是唯一键或主键。首先,您的参考不太正确:
ALTER TABLE tbl_user ADD CONSTRAINT FK_RIGHTS_ID
FOREIGN KEY (rights) REFERENCES rights_id(id);
------------------------------------^
应该是:
ALTER TABLE tbl_user ADD CONSTRAINT FK_RIGHTS_ID
FOREIGN KEY (rights) REFERENCES tbl_userrights(rights_id);
(虽然我认为两个表中的列应该被称为rights_id
以避免混淆。)
其次,除了自动递增外,还需要tbl_userrights(rights_id)
作为表的主键。