FOREIGN_KEY_CHECKS para el roolback de las migraciones de tipo foreign key en Laravel

- Andrés Cruz

In english
FOREIGN_KEY_CHECKS para el roolback de las migraciones de tipo foreign key en Laravel

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.

Migraciones lista
Migraciones lista

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

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.