sqlstate ondelete incorrectly hy000 general formed foreign error delete constraint cannot mysql foreign-keys laravel

mysql - incorrectly - ondelete laravel



"Error general: 1005 No se puede crear la tabla" Uso de Laravel Schema Build y Foreign Keys (11)

Laravel5, MySQL55, CentOS65

en mi caso los errores fueron los mismos que este.

Error: [Illuminate / Database / QueryException]
SQLSTATE [HY000]: Error general: 1005 No se puede crear la tabla ''nabsh. # Sql-5b0_e'' (errno: 121) (SQL: modificar la tabla usermeta add constraint usermeta_uid_foreign clave externa ( uid ) ref erences users ( id ) en delete cascade )

Encontré un buen consejo en la respuesta aprobada de este problema: ERROR: Error 1005: No se puede crear la tabla (errno: 121)

Consejo: Recibirá este mensaje si está intentando agregar una restricción con un nombre que ya se usó en otro lugar.

en mi caso, este error significa que la restricción que se intentó agregar ya existe en algún lugar (pero no pude verlos en ningún lado).

Copié la consulta de error de salida y la ejecuté dentro de la secuela pro, luego ojalá volviera a ver el mismo error. como la sugerencia dice que cambié el nombre de la restricción a algo más, a continuación, se vio afectado sin error, por lo que hay un problema con el generador de nombres de restricciones en laravel5 + MySQL55 + CentOS65.

Solución: intente cambiar el nombre de las restricciones enviando el segundo parámetro al método foráneo en el esquema de la tabla.

Schema::table(''tutorials'', function($table) { $table->foreign(''author'')->references(''id'')->on(''users''); $table->foreign(''lesson'')->references(''id'')->on(''lessons''); });

a ->

Schema::table(''tutorials'', function($table) { $table->foreign(''author'', ''fk_tutorials_author'')->references(''id'')->on(''users''); $table->foreign(''lesson'', ''fk_tutorials_lesson'')->references(''id'')->on(''lessons''); });

Espero que ayude. funciona en mi caso

Esencialmente, estoy teniendo el mismo problema que este tipo, menos el prefijo de la tabla. Como no tengo prefijo de tabla, su solución no funciona. http://forums.laravel.com/viewtopic.php?id=972

Estoy intentando construir una tabla usando el generador de esquemas de Laravel así:

Schema::create(''lessons'', function($table) { $table->increments(''id''); $table->string(''title'')->nullable(); $table->string(''summary'')->nullable(); $table->timestamps(); }); Schema::create(''tutorials'', function($table) { $table->increments(''id''); $table->integer(''author''); $table->integer(''lesson''); $table->string(''title'')->nullable(); $table->string(''summary'')->nullable(); $table->string(''tagline'')->nullable(); $table->text(''content'')->nullable(); $table->text(''attachments'')->nullable(); $table->timestamps(); }); Schema::table(''tutorials'', function($table) { $table->foreign(''author'')->references(''id'')->on(''users''); $table->foreign(''lesson'')->references(''id'')->on(''lessons''); });

El problema es que cuando ejecuto este código (en una ruta / setup), aparece el siguiente error:

SQLSTATE[HY000]: General error: 1005 Can''t create table ''tutorials.#sql-2cff_da'' (errno: 150) SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`) Bindings: array ( )

Según las publicaciones en la web y la documentación limitada disponible sobre cómo configurar las relaciones Eloquentes de Laravel, no estoy seguro de qué estoy haciendo mal ...

users ya existen y tiene un campo de id que es auto_increment . También estoy configurando mis modelos con las relaciones adecuadas ( belongs_to y has_many ), pero hasta donde sé, este no es el problema, es la configuración de la base de datos. El DB es InnoDB.

¿Qué estoy haciendo exactamente mal con la clave externa?


Debes darle al entero un indicador sin firmar en Laravel 5.4, como este:

public function up() { Schema::create(''posts'', function (Blueprint $table) { $table->increments(''post_id''); $table->text(''title''); $table->text(''text''); $table->integer(''employee_post_id_number'')->unsigned(); $table->foreign(''employee_post_id_number'')->references (''employee_id_number'')->on(''employees''); $table->timestamps(); }); }


Esto es lo que hago en Laravel 5:

// CREATING TABLE Schema::create(''your_table_name'', function (Blueprint $table) { $table->engine = ''InnoDB''; $table->increments(''id''); // index field example sample $table->string(''field2''); // some varchar/string field sample $table->integer(''field3''); // some integer field sample $table->integer(''field_some_table_id'')->unsigned; //for field that contains foreign key constraint }); // FOREIGN KEY CONSTRAINT Schema::table(''stock'', function ($table) { $table->foreign(''field_some_table_id'')->references(''id'')->on(''some_table'')->onDelete(''cascade'')->onUpdate(''cascade''); });

Eso es todo por la conclusión, y funciona para mí.


Esto me sucedió en las migraciones de Yii Framework 1.x también. Resultó que de manera similar a las soluciones de Laravel anteriores puede ser causada por una

  • nombre incorrecto de la tabla deletreado (o aún no existente)
  • nombre de columna mal deletreado (o aún no existente)
  • duplicar nombre de clave externa en la misma base de datos que se utiliza en diferentes tablas

He estado teniendo el mismo problema. Acabo de notar la siguiente nota en la parte inferior de los documentos de Laravel Schema :

Nota: El campo al que se hace referencia en la clave externa es muy probablemente un incremento automático y, por lo tanto, automáticamente un entero sin signo. Asegúrese de crear el campo de clave externa con unsigned (), ya que ambos campos tienen que ser del mismo tipo, el motor de ambas tablas debe configurarse en InnoDB y la tabla a la que se hace referencia debe crearse antes que la tabla con la clave externa .

Para mí, tan pronto como configuro mis campos de clave externa como tales:

$table->integer(''author'')->unsigned();

No tuve ningún problema

EDITAR: Además, asegúrese de que los campos en la tabla foránea ya estén creados, de lo contrario, puede fallar con el mismo error.


La forma más sencilla es desactivar las comprobaciones de claves externas:

DB::statement(''set foreign_key_checks=0''); Schema::table( ... ); DB::statement(''set foreign_key_checks=1'');


Me encontré con este problema también.

La solución que encontré es que las tablas que contienen la identificación que se está utilizando una identificación extranjera deben crearse antes de que otra mesa pueda hacer referencia a ella. Básicamente, estás creando una tabla y diciéndole a MySQL que haga referencia a la clave principal de otra tabla, pero esa tabla aún no existe.

En su ejemplo, el autor y las tablas de lecciones deben crearse primero.

El orden en el que se crean las tablas depende de los artesanos y del orden en que creó sus archivos de migración.

Mi opinión sería vaciar su base de datos de todas las tablas y cambiar las marcas de tiempo en los nombres de los archivos de migración (o eliminarlas y recrearlas en el orden correcto) para que su autor y las tablas de lecciones se creen antes de su tabla de tutoriales.


No estoy 100% seguro de que estos sean los motivos por los que está fallando, sino un par de sugerencias. Si está utilizando una versión anterior de mySQL como base de datos, la implementación de la tabla predeterminada es myISAM que no admite restricciones de claves externas. Como sus scripts están fallando en la asignación de la clave externa, es mejor que explícitamente indique que quiere que INNODB sea el motor que usa esta sintaxis en el método de creación de Schema.

Schema::create(''lessons'', function($table) { $table->engine = ''InnoDB''; $table->increments(''id''); $table->string(''title'')->nullable(); $table->string(''summary'')->nullable(); $table->timestamps(); });

Esto debería aliviar los problemas que está teniendo.

Además, aunque puede declarar claves externas como una idea de último momento, creo las claves foráneas dentro del esquema inicial, ya que puedo hacer una verificación fácil para asegurarme de que tengo el motor DB correcto.

Schema::create(''tutorials'', function($table) { $table->engine = ''InnoDB''; $table->increments(''id''); $table->integer(''author''); $table->integer(''lesson''); $table->string(''title'')->nullable(); $table->string(''summary'')->nullable(); $table->string(''tagline'')->nullable(); $table->text(''content'')->nullable(); $table->text(''attachments'')->nullable(); $table->timestamps(); $table->foreign(''author'')->references(''id'')->on(''users''); $table->foreign(''lesson'')->references(''id'')->on(''lessons''); });

Espero que esto ayude / resuelva tu problema.


Recibí el mismo error porque olvidé establecer el tipo de tabla en InnoDB en la tabla referenciada:

$table->engine = ''InnoDB'';


Un resumen de las respuestas ya enumeradas, más el mío:

  1. Las claves externas generalmente requieren InnoDb, por lo tanto, configure su motor predeterminado o especifique explícitamente

    $ table-> engine = ''InnoDB'';

  2. Las claves externas requieren que exista la tabla referenciada. Asegúrese de que la tabla a la que se hace referencia se crea en una migración anterior, antes de crear la clave. Considera crear las claves en una migración separada para estar seguro.

  3. Las claves externas requieren que el tipo de datos sea congruente. Compruebe si el campo al que se hace referencia es del mismo tipo, ya sea firmado o sin firmar, si su longitud es la misma (o menor).

  4. Si está cambiando entre migraciones de codificación manual y utilizando generadores, asegúrese de verificar el tipo de id. Que está utilizando. Artisan usa incrementos () de manera predeterminada, pero parece que Jeffrey Way prefiere números enteros (''id'', verdadero) .


cuando utilice claves externas, asegúrese de que su clave externa no tenga firma. esto funcionó para mí