MySQL - 添加外键错误

时间:2016-01-09 14:03:58

标签: mysql

我试图将一个外键添加到列中,但是我收到了以下错误:

  

(错误: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  

2 个答案:

答案 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)作为表的主键。