mysql错误1215:无法添加外键约束

m2xkgtsf  于 2021-06-18  发布在  Mysql
关注(0)|答案(21)|浏览(632)

我试图将我的新模式转发到我的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
uttx8gqw

uttx8gqw1#

当由于引用的表使用myisam引擎而发生此错误时,此答案提供了一种快速转换数据库的方法,以便所有django模型表都使用innodb:https://stackoverflow.com/a/15389961/2950621
这是一个django管理命令,名为convert_to_innodb。

cld4siwp

cld4siwp2#

对于其他人来说,相同的错误并不总是由于列类型不匹配造成的,您可以通过发出命令来了解有关mysql外键错误的更多信息

SHOW ENGINE INNODB STATUS;

您可能会在打印消息的顶部发现一个错误,例如
在引用表中找不到引用列显示为第一列的索引,或者表中的列类型与引用表中的列类型不匹配。

z0qdvdin

z0qdvdin3#

我也有同样的问题。
我是这样解决的:
我在 primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT) 我在模式生成器中尝试导入一个表之后找到了这个解决方案。如果对你有用,告诉我!
祝你好运!
菲利佩tércio公司

7z5jn7bk

7z5jn7bk4#

我也有同样的问题,我的解决方案:
之前:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

解决方案:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

我希望这能有所帮助;)

nkhmeac6

nkhmeac65#

错误1215是一个恼人的。爆炸药丸的答案涵盖了基础知识。你要确保从那里开始。然而,还有更多更微妙的情况需要注意:
例如,当您尝试链接不同表的主键时,请确保提供适当的 ON UPDATE 以及 ON DELETE 选项。例如。:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

不会飞,因为主键(如 id )不可能 NULL .
我敢肯定,在添加这些约束时,还有更多类似的微妙问题,这就是为什么在遇到约束错误时,始终确保约束及其含义在当前上下文中是有意义的。祝你的错误1215好运!

1tuwyuhd

1tuwyuhd6#

另一个原因:如果你使用 ON DELETE SET NULL 外键中使用的所有列都必须允许空值。有人在这个问题上发现了这个。
据我所知,数据完整性不会有问题,但mysql似乎不支持这个特性(在5.7中)。

nxowjjhe

nxowjjhe7#

喔,我刚拿到!它混合了许多已经发布的答案(innodb、unsigned等)。但有一件事我在这里没有看到:如果fk指向pk,请确保source列有一个合理的值。例如,如果pk是mediumint(8),请确保源列也包含mediumint(8)。对我来说,这是问题的一部分。

irtuqstp

irtuqstp8#

我经历这个错误的原因完全不同。我使用mysql workbench 6.3创建数据模型(非常棒的工具)。我注意到,当外键约束定义中定义的列顺序与表列顺序不匹配时,也会生成此错误。
我花了大约4个小时的时间尝试了其他一切,但没有检查。
现在一切正常,我可以重新开始编码了

ubbxdtey

ubbxdtey9#

在使用laravel迁移时尝试生成外键
比如这个例子:
用户表

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

颜色表

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

有时物业不管用

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

发生此错误的原因是[use]中的外键(类型)

nr7wwzry

nr7wwzry10#

我找不到这个错误

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)
rjzwgtxy

rjzwgtxy11#

在我的例子中,我使用 SET FOREIGN_KEY_CHECKS=0 ,那么 SET FOREIGN_KEY_CHECKS=1 之后。当我去重新装填table的时候 error 1215 . 问题是数据库中有另一个表,它的外键指向我删除的表,并且正在重新加载。重新加载过程的一部分涉及更改其中一个字段的数据类型,这使得另一个表中的外键无效,从而触发 error 1215 . 我通过删除另一个表,然后用所涉及字段的新数据类型重新加载该表来解决这个问题。

ef1yzkbh

ef1yzkbh12#

在使用laravel4时,我遇到了一个“error 1215:cannot add foreign key constraint”的陷阱,特别是使用jeffreyway的laravel4生成器时。
在laravel4中,您可以使用jeffreyway的生成器生成迁移文件来逐个创建表,也就是说,每个迁移文件生成一个表。您必须知道这样一个事实:每个迁移文件都是用文件名中的时间戳生成的,这给了文件一个顺序。当您启动artisan cli命令“php artisan migrate”时,生成顺序也是迁移操作的顺序。因此,如果文件请求外键约束,该外键约束引用将在后一个文件中生成但尚未生成的键,则触发错误1215。在这种情况下,您需要做的是调整迁移文件生成的顺序。按正确的顺序生成新文件,复制内容,然后删除无序的旧文件。

vwhgwdsa

vwhgwdsa13#

我在尝试添加fk时遇到了相同的错误。在我的例子中,问题是由fk表的pk引起的,它被标记为unsigned。

hgc7kmma

hgc7kmma14#

我只是想把这个案子也加进去 VARCHAR 外键关系。我花了一周时间在mysql workbench 8.0中尝试解决这个问题,最终解决了这个错误。
简而言之:模式、表、列、引用表、引用列以及引用父表的任何其他表的字符集和排序规则必须匹配。
长答案:我的表中有一个枚举数据类型。我把这个改成了 VARCHAR 我可以从引用表中获取值,这样就不必更改父表来添加其他选项。这个外键关系看起来很简单,但我得到了1215个错误。arvind的回答和下面的链接建议使用

SHOW ENGINE INNODB STATUS;

在使用这个命令时,我得到了以下详细的错误描述,没有其他有用的信息
在引用表中找不到引用列显示为第一列的索引,或者表中的列类型与引用表中的列类型不匹配。请注意,在使用>=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 ; 到其他子表。
对于整个架构,我将所有表和列的字符集和排序规则更改为:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

这最终解决了我的问题与1215错误。
旁注:校勘 utf8mb4_general_ci 适用于mysql workbench 5.0或更高版本。校勘 utf8mb4_0900_ai_ci 仅适用于mysql workbench 8.0或更高版本。我认为我在字符集和排序规则方面遇到问题的原因之一是mysql workbench升级到了8.0。这里有一个链接,更多地讨论这个排序规则。

nwo49xxi

nwo49xxi15#

当列的类型不同时也会发生这种情况。
e、 如果你引用的列是无符号的int,而被引用的列是int,那么你会得到这个错误。

相关问题