AWS RDS 的外键约束不起作用

Posted

技术标签:

【中文标题】AWS RDS 的外键约束不起作用【英文标题】:Foreign Key contraints with AWS RDS not working 【发布时间】:2016-07-23 16:00:24 【问题描述】:

我正在尝试将本地 laravel 数据库迁移到 RDS,我在使用 Elastic beanstalk 时遇到了很多问题,所以我决定采用不同的方式。迁移时,我拥有的每个外键都会出现以下错误:

[Illuminate\Database\QueryException] SQLSTATE[HY000]:一般错误: 1215 无法添加外键约束(SQL:alter table videos add 约束videos_object_id_foreign外键(object_id) 在删除级联时引用objects (id)

PDO异常

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

我研究了 RDS 的外键约束,他们说它们没有被强制执行,但它说它们可以用于信息目的。 每个外键都是无符号的。

Schema::create('videos', function (Blueprint $table) 

        $table->increments('id');
        $table->integer('object_id')->unsigned()->nullable();
        $table->foreign('object_id')->references('id')->on('objects')->onDelete('cascade');
        $table->integer('user_id')->unsigned()->nullable();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->rememberToken();
        $table->timestamps();
    );

注意:我也尝试在创建表后将外键分离到单独的迁移中,但没有成功。

【问题讨论】:

先迁移哪个? videos 还是 objects?这可能是因为您仍然没有 objects 表,而您正在尝试使用该表创建引用。 【参考方案1】:

要查找特定错误,请运行以下命令:

SHOW ENGINE INNODB STATUS

并查看LATEST FOREIGN KEY ERROR 部分。

子列的数据类型必须与父列完全匹配。

此外,您应该在运行 DDL 之前运行查询 set foreign_key_checks=0,这样您就可以按任意顺序创建表,而无需在相关子表之前创建所有父表。

【讨论】:

以上是关于AWS RDS 的外键约束不起作用的主要内容,如果未能解决你的问题,请参考以下文章

oracle中外键的作用

Laravel orm with() 不起作用

LOAD DATA LOCAL INFILE 在 RDS 中不起作用

cakephp hasone 和所属加入不起作用

删除一对零或一个子记录不起作用

MySQL中的外键是什么有什么作用