Intento migrar mi tabla que tiene claves externas. Cada vez que migro mi tabla, produce un error que dice:

Error general: 1215 no se puede agregar la restricción de clave externa

Aquí está la migración de mi tabla:

Schema::create('profile_pictures', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('user_id')->nullable();
    $table->binary('image')->nullable();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Y aquí está mi modelo:

class ProfilePicture extends Model
{
    protected $fillable = [
        'user_id',
        'image'
    ];

    public function user()
    {
        $this->belongsTo(User::class, 'user_id', 'id');
    }
}

Aquí está la migración de mi tabla de usuario:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('username');
    $table->string('first_name')->nullable();
    $table->string('last_name')->nullable();
    $table->string('email')->unique();
    $table->string('phone')->nullable();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
0
Shariffuddin Hussin 22 feb. 2021 a las 05:49

2 respuestas

La mejor respuesta

Actualice la columna user_id de bigInteger a UnsignedBigInteger ya que necesita el mismo tipo de datos y longitud para PK y FK.

Schema::create('profile_pictures', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->binary('image')->nullable();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

Sugeriré seguir la convención y usar el método ForeignId () con restricto ()

Muestra (de la documentación):

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

Puede obtener más detalles aquí: https://laravel.com/docs /8.x/migrations#foreign-key-constraints

1
Jaswinder Singh 22 feb. 2021 a las 05:03

Según WL # 148, una columna de clave externa debe tener el mismo tipo de datos + la misma longitud + la misma escala que la columna de referencia correspondiente.

https://dev.mysql.com/worklog/task/?id=4095

Creo que debería usar $ table-> unsignedBigInteger ('user_id') -> nullable (); en lugar de $ table-> bigInteger ('user_id') -> nullable ();

0
Kieu Trung 22 feb. 2021 a las 04:09