2016-03-27 31 views
1

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)

cevap

2

göçler Eğer dosya belirttiğiniz sırayla olur. Belki de bu geçiş işlemi çalıştırıldığında rol tablosunuz oluşturulmadı ve DB'niz (henüz) varolan bir tablodaki bir alana başvurmaya çalışmaktan şikayet ediyor? Örneğin

: Eklenen çözümü: 2016_03_27_0000_first2016_03_28_0000_second

GÜNCELLEME önce çalıştırılacaktır.

NULL olmayan olarak ayarlamaya çalıştığınız alan için "onDelete ('set null')" olduğunu farkettim. Eğer rol silindiyse bu da bir soruna neden olur, çünkü o zaman değeri null olarak ayarlamaya çalışır.

Sen yabancı anahtarları hem belirlesin:

->onDelete('cascade') 

kullanıcı veya rol, bunlarla ilgili herhangi dernekler de otomatik olarak silinir alacağı silinir ve sadece null ayarlanmamış ya takılmak sol olsun, bu şekilde .

Alkış

+0

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

+1

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. –

+0

İyi olan! Bunu deneyeceğim ve yakında işe yarayıp yaramadığını size bildireceğim. – Markinson

İlgili konular