Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 无法向表中添加两个外键_Mysql_Database - Fatal编程技术网

Mysql 无法向表中添加两个外键

Mysql 无法向表中添加两个外键,mysql,database,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

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

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
            );
当我尝试在新表中设置外键时,用户ID可以成功完成,但由于以下错误,培训代码无法设置为外键:

ERROR 1215 (HY000): Cannot add foreign key constraint

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

您也需要在表请求中为该列创建索引:

先发行

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);
这对我有用。但我不得不说,它在没有创建索引的情况下也能工作,正如各州的文档所示:

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

我强调。我不知道你的情况有什么问题

问题解释

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

如果表中有数据,那么简单地删除表并不是最好的解决方案。您可以使用将存储引擎更改为InnoDB

ALTER TABLE Training Engine=InnoDB;

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

您可以共享用于添加外键的语句吗?此外,您不能将FKs添加到任何引擎类型!==InnoDB。您的请求表中有数据吗?这是我用来添加外键的命令,它使用用户ID,但不使用培训代码,ALTER table request add foreign key(培训代码)引用培训(培训代码);不,我的表中还没有任何数据..能否删除该表并使用两个外键约束创建一个表?我不能复制这种行为。也许我们可以有
showcreatetablerequest的输出
first请将
SHOW CREATE TABLE request
的输出和
SHOW CREATE TABLE Training
的输出添加到您的问题中。您可以省略一些不相关的列,但没有其他内容。它正在工作!我放弃了数据库,按照VMai的建议从一开始就用索引创建了所有内容。。谢谢大家的帮助:)@ShaherJD我很高兴你的问题得到了解决。如果表
Training
的存储引擎是MyISAM,我可以重现这种行为。但是您用完整的CREATETABLE语句解决了这个问题,我想包括存储引擎。