SQLSTATE[HY000]: Error general: 3780 La columna de referencia ‘user_id’ y la columna de referencia ‘id’ en la clave externa son incompatibles

5 minutos de lectura

Avatar de usuario de Rodri6uez
rodri6uez

Estoy haciendo migraciones en Laravel y me pasa este error cuando procedo con el comando PHP artisan migrate:

En Connection.php línea 664:

SQLSTATE[HY000]: Error general: 3780 La columna de referencia ‘user_id’ y la columna referenciada ‘id’ en la restricción de clave externa ‘almacen_movimientos_user_id_foreign’ son incompatibles. (SQL: modificar tabla almacen_movimientos añadir restricción almacen_movimientos_user_id_foreign clave externa (user_id) referencias users (id

) en eliminar restringir)

En PDOStatement.php línea 129:

SQLSTATE[HY000]: Error general: 3780 La columna de referencia ‘user_id’ y la columna referenciada ‘id’ en la restricción de clave externa ‘almacen_movimientos_user_id_foreign’ son incompatibles.

Mis migraciones se ven así:

tabla almacen_movimientos

public function up()
{
    Schema::create('almacen_movimientos', function (Blueprint $table) {
        $table->unsignedBigInteger('id');
        $table->integer('cliente_proveedor_id');
        $table->integer('empresa_id');
        $table->integer('user_id');
        $table->enum('tipo' , ['ENTRADA' , 'SALIDA' , 'REUBICACION' , 'TRASPASO' , 'DEVOLUCION' , 'MSRO' , 'ENTRADA POR TRASPASO' , 'SALIDA POR TRASPASO'])->nullable();
        $table->string('referencia' , 255)->nullable();
        $table->string('observaciones' , 255)->nullable();
        $table->timestamp('created_at');
        $table->timestamp('updated_at');
        $table->timestamp('deleted_at');
        $table->string('transportista' , 255)->nullable();
        $table->string('operador' , 255)->nullable();
        $table->string('procedencia' , 255)->nullable();
        $table->integer('almacen_id')->nullable();

        $table->foreign('cliente_proveedor_id')->references('id')->on('empresas')->onDelete('restrict');
        $table->foreign('empresa_id')->references('id')->on('empresas')->onDelete('restrict');
        $table->foreign('user_id')->references('id')->on('users')->onDelete('restrict');
        $table->foreign('almacen_id')->references('id')->on('almacenes')->onDelete('restrict');
    });
}

Tabla de usuarios

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->unsignedBigInteger('id');
        $table->string('name' , 255);
        $table->string('apellido_paterno' , 115)->nullable();
        $table->string('apellido_materno' , 115)->nullable();
        $table->dateTime('fecha_nacimiento')->nullable();
        $table->string('telefono1' , 10)->nullable();
        $table->string('telefono2' , 10)->nullable();
        $table->string('calle' , 255)->nullable();
        $table->string('numero' , 45)->nullable();
        $table->string('colonia' , 255)->nullable();
        $table->string('codigo_postal' , 6)->nullable();
        $table->string('email' , 255)->unique();
        $table->string('user' , 20)->nullable()->unique();
        $table->string('password' , 255);
        $table->string('palabra_secreta' , 255);
        $table->string('remember_token' , 100)->nullable();
        $table->unsignedInteger('empresa_id')->nullable();
        $table->timestamp('created_at');
        $table->timestamp('updated_at');
        $table->timestamp('deleted_at');

        $table->foreign('empresa_id')->references('id')->on('empresas')->onDelete('restrict');
    });
}

¿Alguien puede decirme qué estoy haciendo mal? No puedo arreglar esto.

Gracias.

Saludos.

  • El tipo de clave externa debe ser exactamente el mismo con el id al que queremos hacer referencia. En este caso, debe cambiar el tipo de columnas de clave externa al tipo BigInteger sin signo.

    – Tohid Dadashnejad

    25 de agosto de 2020 a las 19:10

  • Y no te olvides de ejecutar php artesanal migrate:fresh para reconstruir las tablas completas.

    – Tohid Dadashnejad

    25 de agosto de 2020 a las 19:11

  • Utilizar esta $table->unsignedBigInteger('user_id')->nullable();

    – Sobir

    25 de agosto de 2020 a las 19:22

  • Todavía muestra el mismo error 🙁

    – rodriguez

    25 de agosto de 2020 a las 19:41

  • $table->id(); //UNSIGNED BIG INTEGER entonces $table->unsignedBigInteger('empresa_id')

    – Muhammad Shahzad

    5 mayo 2021 a las 18:56

Avatar de usuario de M Khalid Junaid
M Khalid Junaid

En users tabla en la que ha definido la clave principal con id como bigint sin firmar y en almacen_movimientos tabla la referenciada user_id se define como int

cambiar

$table->integer('user_id');

a

$table->unsignedBigInteger('user_id');

La estructura y el tipo de datos de PRIMARY KEY y FOREIGN KEY deben ser iguales

  • @Rodri6uez asegúrate de tener lo mismo colaciones para ambos campos verificar desde la base de datos

    – M Khalid Junaid

    26 de agosto de 2020 a las 15:27


Avatar de usuario de Abdelsalam Megahed
Abdel Salam Megahed

Asegúrese de que el tipo de datos de clave externa sea el mismo que su columna de referencia

  • Compruebe también la codificación de su columna si es del tipo VARCHAR o similar.

    – Gesuchter

    22 de abril a las 3:05

También puedes resolver de una manera más elegante cambiando en tu esquema de almacen_movimientos deberías cambiar:

$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('restrict');

con

$table->foreignId('user_id')->constrained()->onDelete('restrict');

Echa un vistazo a la documentación, puedes hacerlo desde Laravel 7 en:
https://laravel.com/docs/8.x/migrations#foreign-key-constraints

Avatar de usuario de Jonathan Güths
Jonathan Guths

$table->increments('id')  

use unsignedInteger en su clave externa

$table->id() 

            

use unsignedBigInteger en su clave externa

Siga el tipo de datos para resolver estos problemas.

public function up(){
Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('body');
    $table->unsignedBigInteger('user_id');
    $table->timestamps();
    $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
});
}

Observó que la columna local (‘id’) se estableció en bigIncrements(‘id’) y la externa se estableció en Entero grande sin signo.

  • Haga esto en su archivo de migraciones y asegúrese de crear todos los locales antes que los extranjeros. Por ejemplo, crear usuarios antes que productos, ya que el usuario será un extranjero en el reino de los productos.

    – Codedreamer

    14/09/2021 a las 19:59

avatar de usuario de cursorrux
cursorrux

$table->integer('user_id');
$table->foreignId('user_id');

Deberías intentarlo Este : –

$table->unsignedBigInteger('user_id');

  • Haga esto en su archivo de migraciones y asegúrese de crear todos los locales antes que los extranjeros. Por ejemplo, crear usuarios antes que productos, ya que el usuario será un extranjero en el reino de los productos.

    – Codedreamer

    14/09/2021 a las 19:59

¿Ha sido útil esta solución?