使用 Laravel 迁移创建外键时出现 MySQL 错误

Posted

技术标签:

【中文标题】使用 Laravel 迁移创建外键时出现 MySQL 错误【英文标题】:MySQL error when creating foreign key with Laravel migration 【发布时间】:2014-04-03 01:39:03 【问题描述】:

我设置了一个 Laravel 应用程序,并且正在使用 Sentry 2 进行用户身份验证。我有一个名为Post 的模型以及默认哨兵User 表。我想让一个用户有很多帖子,一个帖子属于一个用户。为了在我的数据库架构中反映这一点,我需要在 postsusers 之间创建一个外键约束。

我写的迁移如下:

public function up()

    Schema::table('posts', function(Blueprint $table)
    
        $table->integer('user_id')->after('id')->nullable();
        $table->foreign('user_id')->references('id')->on('users');
    );

使用php artisan migrate 运行它后,我在命令提示符中收到 mysql 错误:

[照亮\数据库\查询异常] SQLSTATE[HY000]:一般错误: 1005 无法创建表 'blog.dev.#sql-3bb_2d' (errno: 150) (SQL: 改变表posts添加约束posts_user_id_foreign 外键 (user_id) 引用 users (id))

起初我以为是因为users 中的主键列与我的外键列user_id 的定义不同,但它们都定义为int(10)

从谷歌我了解到这个错误可能是由于两列定义不同造成的,但这里似乎不是这种情况。

【问题讨论】:

【参考方案1】:

外键应该已经在数据库中,因此我建议采取两个步骤。另外我建议将user_id 的专栏设为无符号:

public function up()

    Schema::table('posts', function(Blueprint $table)
    
        $table->integer('user_id')->after('id')->nullable()->unsigned();
    );

    Schema::table('posts', function(Blueprint $table)
    
        $table->foreign('user_id')->references('id')->on('users');
    );

【讨论】:

【参考方案2】:
public function up()

    Schema::table('posts', function(Blueprint $table)
    
        $table->integer('user_id')->nullable()->after('id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
    );

【讨论】:

【参考方案3】:

我解决了

Schema::disableForeignKeyConstraints();

在第一次迁移之前和

Schema::enableForeignKeyConstraints();

在上次迁移中

Screenshot

【讨论】:

以上是关于使用 Laravel 迁移创建外键时出现 MySQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库的Laravel迁移“无法添加外键约束”错误

Laravel 5.2 迁移第二个表时出现数据库迁移错误

laravel 和 artisan 错误无法在迁移时添加外键

尝试迁移 Laravel 数据库时出现错误

SQLSTATE [HY000] Laravel 8 中的外键约束格式错误

在子表 Laravel 中插入数据时出现外键问题