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语句解决了这个问题,我想包括存储引擎。