即使没有添加外键也无法添加外键约束
Posted
技术标签:
【中文标题】即使没有添加外键也无法添加外键约束【英文标题】: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();
);
我在 *** 上搜索了高低,并尝试了以下方法。
验证我的用户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
并重试
【参考方案1】:
我的暂存数据库和生产数据库在同一个 mysql 服务器上。
来看看,您可以让一个外键约束来自具有相似或相同表的不同数据库,并在您正在处理的数据库上提出此类问题。
回答这个问题,而不是在极少数情况下将其删除,因为其他人将其视为面包屑。
"不能添加外键约束" 检查其他数据库的约束
【讨论】:
以上是关于即使没有添加外键也无法添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章