Estoy usando Laravel 7 y PHP 7.4.
Estoy trabajando en bases de datos y de repente me quedé atascado cuando intento generar una clave externa para el usuario en otra tabla. Debería ser un proceso inmediato y estoy siguiendo el documento, sigo recibiendo un error.
Error general: 1005 No se puede crear la tabla
carchain_qrcode.sellers(errno: 150 "La restricción de clave externa está formada incorrectamente
Tabla de usuarios
public function up() { Schema::create('users', function (Blueprint $table) { $table->bigInteger('id'); $table->string('name')->unique(); $table->string('email')->unique(); }); }Tabla de vendedores
public function up() { Schema::create('sellers', function (Blueprint $table) { $table->bigInteger('id'); $table->unsignedBigInteger('user_id'); $table->string('seller_name'); $table->string('seller_email'); $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); });¿Dónde me he equivocado?
Creo que el problema es que la identificación de la tabla de usuarios es bigInteger y no bigIncrements o unsignedBigInteger .
En Laravel 7, simplemente puede hacer: $tabla->id() para crear la columna de identificación.
este error se produjo debido a un tipo de datos incorrecto utilizado en la clave externa que va a crear. El tipo de datos de clave principal en la users table debe ser el mismo que el tipo de datos que usó en la Sellers table como se muestra a continuación:
Tabla de usuarios
$table->id();Tabla de vendedores
$table->unsignedBigInteger('user_id');o si usó cualquier otro tipo de datos en la clave principal de la tabla de usuarios, entonces la clave externa en la otra tabla debería ser la misma en consecuencia.
Breve : para una solución rápida, consulte la respuesta de @ Aless55. Lo principal a tener en cuenta es que los tipos de columna id y foreign_key deben coincidir.
Forma correcta : es mejor usar las API integradas de Laravel para crear primary key y foreign key . Más detalles aquí: automáticamente se encargará de los tipos de columna, creando índices, etc. Además, ceñirse a la documentación oficial facilita la comprensión del código por parte de otros y el mantenimiento por parte del desarrollador (es solo mi opinión).
En tu caso:
Tabla de usuarios
public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); $table->string('email')->unique(); }); }Tabla de vendedores:
public function up() { Schema::create('sellers', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained(); // this will automatically detect which table to reference $table->string('seller_name'); $table->string('seller_email'); }); }