【问题标题】:Cannot Add Foreign Key Constraint even no foreign keys are added即使没有添加外键也无法添加外键约束
【发布时间】:2021-12-14 03:23:14
【问题描述】:

Laravel 8

由于某种原因,我的暂存环境不允许我运行迁移。

我收到以下错误。

General error: 1215 Cannot add foreign key constraint (
SQL: create table `login_credentials` (
`id` char(36) not null, 
`username` varchar(75) not null, 
`confirmation_code` varchar(36) null, 
`deleted_at` timestamp null, 
`remember_token` varchar(100) null, 
`created_at` timestamp null, 
`updated_at` timestamp null) 
default character set utf8mb4 
collate 'utf8mb4_unicode_ci' 
engine = InnoDB)

我还没有定义任何外键,这似乎是最近才开始的。我为我的应用程序编写了单元测试,所以我的大部分开发都是在本地完成的。

在我推送到生产之前,我很少会上传到登台服务器以进一步测试更详细的内容。如果它是一个小的可协商更改,那么一旦单元测试通过并验证干净的构建,它将从本地转到生产。所以不幸的是,从现在到几周前,这成为了一个问题。

我的 login_credentials 迁移文件。

class CreateLoginCredentialsTable extends Migration
{

    public function up(): void
    {
        Schema::create('login_credentials', function (Blueprint $table) {
            $table->uuid('id')->nullable(false)->unique()->primary();
            $table->string('username',75)->unique();
            $table->string('confirmation_code',36)->nullable()->unique();
            $table->softDeletes();
            $table->rememberToken();
            $table->timestamps();
        });
    }

}

我在 Stackoverflow 上搜索了高低,并尝试了以下方法。

  • 验证我的用户 id 列在任何地方都作为 uuid 匹配。
  • 验证数据库是 InnoDB
  • 验证没有在任何迁移中定义外键
  • 验证迁移文件的执行顺序是否正确
  • 将作曲家更新为最新的依赖项/版本。
  • 运行所有 artisan 命令以清除缓存、会话、路由、视图等。
  • 当 tbl 的 id 是 uuid 时,验证我的模型是 $incrementing = false。
  • 将 laravel 迁移文件移动到我的迁移文件夹中,并将 Cashier::ignoreMigrations(); Passport::ignoreMigrations(); 添加到我的 appserviceprovider 并更新这些迁移文件以确保 user_id 不是 bigInt 或 Int,并定义为 uuid。
  • 编写一个 trait 以确保 laravel 知道 id 是一个 uuid。

在我的本地主机中运行迁移文件运行良好,没有错误。

有什么想法吗?

即使删除了除单个 login_credentials 表之外的所有迁移文件,仍然出现相同的错误?我要疯了吗??

【问题讨论】:

  • 我创建了一个迁移文件并复制了您的架构并运行以从我这里调试它,但它运行时没有错误,i.stack.imgur.com/UIRrw.png,i.stack.imgur.com/A1NND.png,所以现在的问题是,您是什么数据库使用,以及您是如何进行迁移的
  • 运行 composer dump-autoload 并重试

标签: mysql laravel database foreign-keys


【解决方案1】:

我的暂存数据库和生产数据库在同一个 mysql 服务器上。

来看看,您可以让一个外键约束来自具有相似或相同表的不同数据库,并在您正在处理的数据库上提出此类问题。

回答这个问题,而不是在极少数情况下将其删除,因为其他人将其视为面包屑。

"不能添加外键约束" 检查其他数据库的约束

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2020-09-12
    • 2017-07-16
    • 2013-03-10
    • 2021-11-05
    • 2018-02-13
    • 2018-05-16
    相关资源
    最近更新 更多