Taşımacılıklara yabancı anahtar kısıtlaması eklemeyi deniyorum. Bazı sebeplerden dolayı onu null olarak ayarladığımda işe yaramıyor, ama null yapmazken işe yaramıyor. Bu neden oluyor ve bunu nasıl çözebilirim?Laravel - 1215 Yabancı anahtar kısıtlaması eklenemiyor
Bu yaptığı işlerde:
Schema::create('role_user', function (Blueprint $table){
$table->increments('id');
$table->integer('role_id')->unsigned()->index();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('set null');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
$table->timestamps();
});
rolü ve kullanıcı tabloları bu kısıtlamaları yapmadan önce zaten excist ikisi:
Schema::create('role_user', function (Blueprint $table){
$table->increments('id');
$table->integer('role_id')->unsigned()->index()->nullable();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('set null');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
$table->timestamps();
});
Bu istisna atar. Onlara null olmamasını istiyorum (bu yüzden doldurulmalıdır). Hata:
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table role_user add constraint role_user_role_id_foreign foreign key (role_id) references roles (id) on delete set null)
Onu da düşündüm ve doğru sırayla koydum ama hala çalışmıyor. Bu sql genel hatası, yanlış olabilir şeyler çok geniş bir çeşitlilik vardır utanç verici – Markinson
Ah Sadece fark ettim ki onDelete ('set null'); 'olmayan olarak ayarlamaya çalıştığınız dizin alanı için -nullable. Bu rol de silinirse, bir soruna neden olur ve bu girdiyi null değerine ayarlamaya çalışır. Belki de her iki yabancı anahtarı da '-> onDelete ('cascade') olarak ayarlamaya çalışmalısınız, aksi takdirde kullanıcı veya rol silinirse, bunlarla ilgili herhangi bir ilişki sizin için de silinir. –
İyi olan! Bunu deneyeceğim ve yakında işe yarayıp yaramadığını size bildireceğim. – Markinson