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ónalmacen_movimientos_user_id_foreign
clave externa (user_id
) referenciasusers
(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.
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
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
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
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
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