我有两张表格如下: 第一张表:
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>
答案 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,如前所述。
我的重点。我不知道你的问题是什么。
问题说明
如果表Training
正在使用MyISAM存储引擎,则可以重现问题中提到的行为。然后创建引用表Training
的外键将产生上述错误。
如果表中有数据,那么简单删除表将不是最佳解决方案。您可以使用
将存储引擎更改为InnoDBALTER TABLE Training Engine=InnoDB;
现在您可以成功添加外键约束。