FOREIGN_KEY_CHECKS para el roolback de las migraciones de tipo foreign key en Laravel
- Andrés Cruz
Veremos cómo podemos resolver un error bastante molesto que puede ocurrir cuando haces el rollback de las migraciones que tengan relaciones de tipo foráneas en Laravel: el error en cuestión, luce como el siguiente:
SQLSTATE[HY000]: General error: 3730 Cannot drop table 'tutorials' referenced by a foreign key constraint 'inscribed_tutorial_id_foreign' on table 'inscribed'. (SQL: drop table if exists `tutorials`)
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:703
699 // If an exception occurs when attempting to run a query, we'll format the error
700 // message to include the bindings with SQL, which will make this exception a
701 // lot more helpful to the developer instead of just the database's errors.
702 catch (Exception $e) {
703 throw new QueryException(
704 $query, $this->prepareBindings($bindings), $e
705 );
706 }
707 }
Esto es, a primeros análisis, un error de las claves foráneas o foreign key que aplicamos a nuestras tablas, todo es muy bueno cuando hacemos este tipo de relaciones, en la cual, por ejemplo, la tabla tutorials existe antes que la tabla inscribed_tutorial_id_foreign, y a esta última, aplicamos una relación de tipo FK o foránea:
<?php
use Carbon\Carbon;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class CreateTutorialsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tutorials', function (Blueprint $table) {
***
$table->foreignId('user_id')->constrained()
->onDelete('cascade');
***
});
}
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('tutorials');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
}
Como puedes ver, la novedad está en que en el momento de borrar una tabla que guarda relaciones con otra tabla de tipo FK, desactivamos el check a las claves foráneas.
Resolución
Para evitar esto, podemos desactivar el check para las claves foráneas en aquellas tablas que es empleada por otras para guardar las referencias (FKs)
Opcional:
En SQL es algo así:
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS table1;
SET FOREIGN_KEY_CHECKS = 1;
Siempre recuerda, luego de hacer el drop de la tabla, volver a habilitar el check
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter