Fix Laravel “SQLSTATE[HY000]: Cannot add foreign key constraint” (2025)
🔧 Fix “SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint” in Laravel (2025)
When running migrations in Laravel, you may face this error:
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
This looks scary 😱, but it’s a very common issue and has some simple fixes. Let’s break it down.
🚨 Why Does This Error Happen?
Laravel uses MySQL (or MariaDB) under the hood. This error usually happens when:
Wrong Database Engine
MySQL supports foreign keys only in InnoDB engine, not in MyISAM.
Datatype Mismatch
Your foreign key column and the referenced column must have the same datatype.
Example: If id is unsignedBigInteger, then the foreign key must also be unsignedBigInteger.
Order of Migrations
The parent table must exist before the child table tries to reference it.
🛠 Step-by-Step Fix
✅ 1. Check Table Engine
Make sure your tables use InnoDB. In your migration, always use:
Schema::create('users', function (Blueprint $table) {
$table->id(); // unsignedBigInteger by default
$table->string('name');
$table->timestamps();
});
👉 If your table is still created with MyISAM, change the default engine in your config/database.php:
'mysql' => [
'engine' => 'InnoDB',
],
✅ 2. Match Foreign Key Datatypes
Suppose you have users and posts tables.
❌ Wrong:
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users');
✅ Correct:
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Always match the datatype with the parent table’s primary key.
✅ 3. Migration Order
If posts references users, the users table must be migrated first.
Run php artisan migrate:status to check migration order.
If needed, rename migration files to fix order (example: 2025_01_01_000000_create_users_table.php should come before 2025_01_01_010000_create_posts_table.php).
✅ 4. Refresh Migrations
If you already tried multiple times and messed up, just refresh everything:
php artisan migrate:fresh --seed
👉 This drops all tables, runs migrations again, and seeds fresh data.
🎯 Pro Tips
Always use $table->id() (auto unsignedBigInteger) for primary keys.
When creating foreign keys, use $table->foreignId('user_id')->constrained()->onDelete('cascade'); – this is clean and prevents errors.
Check for typos in table names or column names.
✅ Final Words
This error looks complex but is easy to fix once you understand:
Database engine = InnoDB
Datatype must match
Migration order matters