我试图将我的新模式转发到我的db服务器上,但是我不明白为什么会出现这个错误。我试着在这里搜索答案,但我找到的所有东西都说要么将db引擎设置为innodb,要么确保我尝试用作外键的键是它们自己表中的主键。如果我没弄错的话,这两件事我都做过。你们还能提供什么帮助吗?
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
`Clients_Case_Number` INT NOT NULL ,
`Staff_Emp_ID` INT NOT NULL ,
PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
CONSTRAINT `fk_Clients_has_Staff_Clients`
FOREIGN KEY (`Clients_Case_Number` )
REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Clients_has_Staff_Staff1`
FOREIGN KEY (`Staff_Emp_ID` )
REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
sql脚本执行完成:语句:7成功,1失败
下面是父表的sql。
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
`Case_Number` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
`Address` CHAR(50) NULL ,
`Phone_Number` INT(10) NULL ,
PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
`Emp_ID` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
21条答案
按热度按时间uttx8gqw1#
当由于引用的表使用myisam引擎而发生此错误时,此答案提供了一种快速转换数据库的方法,以便所有django模型表都使用innodb:https://stackoverflow.com/a/15389961/2950621
这是一个django管理命令,名为convert_to_innodb。
cld4siwp2#
对于其他人来说,相同的错误并不总是由于列类型不匹配造成的,您可以通过发出命令来了解有关mysql外键错误的更多信息
您可能会在打印消息的顶部发现一个错误,例如
在引用表中找不到引用列显示为第一列的索引,或者表中的列类型与引用表中的列类型不匹配。
z0qdvdin3#
我也有同样的问题。
我是这样解决的:
我在
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)
我在模式生成器中尝试导入一个表之后找到了这个解决方案。如果对你有用,告诉我!祝你好运!
菲利佩tércio公司
7z5jn7bk4#
我也有同样的问题,我的解决方案:
之前:
解决方案:
我希望这能有所帮助;)
nkhmeac65#
错误1215是一个恼人的。爆炸药丸的答案涵盖了基础知识。你要确保从那里开始。然而,还有更多更微妙的情况需要注意:
例如,当您尝试链接不同表的主键时,请确保提供适当的
ON UPDATE
以及ON DELETE
选项。例如。:不会飞,因为主键(如
id
)不可能NULL
.我敢肯定,在添加这些约束时,还有更多类似的微妙问题,这就是为什么在遇到约束错误时,始终确保约束及其含义在当前上下文中是有意义的。祝你的错误1215好运!
1tuwyuhd6#
另一个原因:如果你使用
ON DELETE SET NULL
外键中使用的所有列都必须允许空值。有人在这个问题上发现了这个。据我所知,数据完整性不会有问题,但mysql似乎不支持这个特性(在5.7中)。
nxowjjhe7#
喔,我刚拿到!它混合了许多已经发布的答案(innodb、unsigned等)。但有一件事我在这里没有看到:如果fk指向pk,请确保source列有一个合理的值。例如,如果pk是mediumint(8),请确保源列也包含mediumint(8)。对我来说,这是问题的一部分。
irtuqstp8#
我经历这个错误的原因完全不同。我使用mysql workbench 6.3创建数据模型(非常棒的工具)。我注意到,当外键约束定义中定义的列顺序与表列顺序不匹配时,也会生成此错误。
我花了大约4个小时的时间尝试了其他一切,但没有检查。
现在一切正常,我可以重新开始编码了
ubbxdtey9#
在使用laravel迁移时尝试生成外键
比如这个例子:
用户表
颜色表
有时物业不管用
发生此错误的原因是[use]中的外键(类型)
nr7wwzry10#
我找不到这个错误
rjzwgtxy11#
在我的例子中,我使用
SET FOREIGN_KEY_CHECKS=0
,那么SET FOREIGN_KEY_CHECKS=1
之后。当我去重新装填table的时候error 1215
. 问题是数据库中有另一个表,它的外键指向我删除的表,并且正在重新加载。重新加载过程的一部分涉及更改其中一个字段的数据类型,这使得另一个表中的外键无效,从而触发error 1215
. 我通过删除另一个表,然后用所涉及字段的新数据类型重新加载该表来解决这个问题。ef1yzkbh12#
在使用laravel4时,我遇到了一个“error 1215:cannot add foreign key constraint”的陷阱,特别是使用jeffreyway的laravel4生成器时。
在laravel4中,您可以使用jeffreyway的生成器生成迁移文件来逐个创建表,也就是说,每个迁移文件生成一个表。您必须知道这样一个事实:每个迁移文件都是用文件名中的时间戳生成的,这给了文件一个顺序。当您启动artisan cli命令“php artisan migrate”时,生成顺序也是迁移操作的顺序。因此,如果文件请求外键约束,该外键约束引用将在后一个文件中生成但尚未生成的键,则触发错误1215。在这种情况下,您需要做的是调整迁移文件生成的顺序。按正确的顺序生成新文件,复制内容,然后删除无序的旧文件。
vwhgwdsa13#
我在尝试添加fk时遇到了相同的错误。在我的例子中,问题是由fk表的pk引起的,它被标记为unsigned。
hgc7kmma14#
我只是想把这个案子也加进去
VARCHAR
外键关系。我花了一周时间在mysql workbench 8.0中尝试解决这个问题,最终解决了这个错误。简而言之:模式、表、列、引用表、引用列以及引用父表的任何其他表的字符集和排序规则必须匹配。
长答案:我的表中有一个枚举数据类型。我把这个改成了
VARCHAR
我可以从引用表中获取值,这样就不必更改父表来添加其他选项。这个外键关系看起来很简单,但我得到了1215个错误。arvind的回答和下面的链接建议使用在使用这个命令时,我得到了以下详细的错误描述,没有其他有用的信息
在引用表中找不到引用列显示为第一列的索引,或者表中的列类型与引用表中的列类型不匹配。请注意,在使用>=innodb-4.1.12创建的表中,enum和set的内部存储类型已更改,并且新表中的这些列不能引用旧表中的这些列。请参阅http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html 正确的外键定义。
之后我用
SET FOREIGN_KEY_CHECKS=0;
正如arvind bharadwaj和此处的链接所建议的:出现以下错误消息:
错误代码:1822。未能添加外键约束。缺少约束的索引
在这一点上,我对模式进行了“反向工程”,并能够在eer图中建立外键关系。在“正向工程”中,我遇到以下错误:
错误1452:无法添加或更新子行:外键约束失败
当我“转发工程师”将eer图转换为一个新的模式时,sql脚本运行正常。通过比较forward engineer尝试生成的sql,我发现不同之处在于字符集和排序规则。父表、子表和两列
utf8mb4
字符集和utf8mb4_0900_ai_ci
但是,父表中的另一列是使用CHARACTER SET = utf8 , COLLATE = utf8_bin ;
到其他子表。对于整个架构,我将所有表和列的字符集和排序规则更改为:
这最终解决了我的问题与1215错误。
旁注:校勘
utf8mb4_general_ci
适用于mysql workbench 5.0或更高版本。校勘utf8mb4_0900_ai_ci
仅适用于mysql workbench 8.0或更高版本。我认为我在字符集和排序规则方面遇到问题的原因之一是mysql workbench升级到了8.0。这里有一个链接,更多地讨论这个排序规则。nwo49xxi15#
当列的类型不同时也会发生这种情况。
e、 如果你引用的列是无符号的int,而被引用的列是int,那么你会得到这个错误。