无法向表中添加两个外键

时间:2014-08-09 17:48:42

标签: mysql database

我有两张表格如下: 第一张表:

CREATE TABLE User ( 
            User_ID VARCHAR(8)NOT NULL PRIMARY KEY,
            User_Name VARCHAR (25) NOT NULL,
            User_Gender CHAR (1) NOT NULL,
            User_Position VARCHAR (10) NOT NULL,
          );

第二桌:

CREATE TABLE Training (
            Training_Code VARCHAR(8) NOT NULL Primary Key,
            Training_Title VARCHAR(30) NOT NULL,
            );

我正在尝试创建一个包含两个外键的表来连接前面的两个表:

CREATE TABLE Request (
            User_ID VARCHAR(8) NOT NULL, 
            Training_Code VARCHAR(8) NOT NULL, 
            Request_Status INT(1) NOT NULL
            );

当我尝试在新表中设置外键时,User_ID可以成功完成,但由于错误,Training_Code无法设置为外键:

ERROR 1215 (HY000): Cannot add foreign key constraint

当我搜索这个问题时,其原因是数据类型不一样,或者名称不一样..但在我的情况下两者都是正确的,所以你能告诉我这里有什么问题吗? / p>

1 个答案:

答案 0 :(得分:1)

表Request中也需要此列的索引:

首先发布

CREATE INDEX idx_training_code ON Request (Training_Code);

然后您应该使用

成功创建外键约束
ALTER TABLE Request
ADD CONSTRAINT FOREIGN KEY idx_training_code (Training_Code) 
    REFERENCES Training(Training_Code);

它对我有用。但我必须说它没有创建索引,因为Using FOREIGN KEY Constraints的文档指出:

  

MySQL要求外键和引用键上的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。 这样的   如果不是,则会自动在引用表上创建索引   存在。如果您创建,可能会在以后静默删除此索引   另一个可用于强制执行外键约束的索引。   如果给定,则使用index_name,如前所述。

我的重点。我不知道你的问题是什么。

Demo

问题说明

如果表Training正在使用MyISAM存储引擎,则可以重现问题中提到的行为。然后创建引用表Training的外键将产生上述错误。

如果表中有数据,那么简单删除表将不是最佳解决方案。您可以使用

将存储引擎更改为InnoDB
ALTER TABLE Training Engine=InnoDB;

现在您可以成功添加外键约束。