2016-03-27 8 views
1

Ich versuche eine Fremdschlüsseleinschränkung in Migrationen hinzuzufügen. Aus irgendeinem Grund funktioniert es, wenn ich es auf Null setze, aber es funktioniert nicht, wenn ich es nicht NULL machen kann. Warum passiert das und wie kann ich das lösen?Laravel - 1215 Konnte keine Fremdschlüsseleinschränkung hinzufügen

Dies funktioniert:

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(); 
    }); 

Dies wirft die Ausnahme:

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(); 
    }); 

Sowohl die Rolle und Benutzertabellen bereits excist bevor diese Einschränkungen zu machen. Ich möchte, dass sie nicht nullfähig sind (also müssen sie ausgefüllt werden). Der Fehler:

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)

Antwort

2

Die Wanderungen in der Reihenfolge vorkommen, dass Sie in den Dateinamen angeben. Vielleicht wurde Ihre Rollentabelle nicht erstellt, als diese Migration ausgeführt wurde und Ihre DB sich darüber beschwert, dass sie versucht hat, auf ein Feld in einer (noch) nicht existierenden Tabelle zu verweisen.

Zum Beispiel: Hinzugefügt Lösung: 2016_03_27_0000_first wird vor 2016_03_28_0000_second

UPDATE ausgeführt werden.

Ich habe festgestellt, dass Sie "onDelete ('set null')" für das Feld haben, das Sie als nicht nullfähig festlegen möchten. Dies würde auch ein Problem verursachen, wenn die Rolle gelöscht würde, da sie dann versuchen würde, den Wert auf null zu setzen.

Sie setzen sollten beide Fremdschlüssel:

->onDelete('cascade') 

diese Weise, wenn der Benutzer oder die Rolle gelöscht werden, werden alle Verbände im Zusammenhang mit ihnen auch automatisch erhalten gelöscht würden und nicht einfach eingestellt hängen auf null oder links um .

Prost

+0

Ich dachte mir das auch und in der richtigen Reihenfolge, aber immer noch nicht funktioniert. Schade, dass dieser sql allgemeine Fehler eine so große Auswahl an Dingen hat, die falsch sein könnten. – Markinson

+1

Oh, ich habe gerade bemerkt, dass Sie auch 'onDelete (' set null '); 'für das Indexfeld haben, das Sie als nicht zu setzen versuchen -nullable. Das würde auch ein Problem verursachen, wenn die Rolle gelöscht wird und es zu diesem Eintrag kaskadiert, indem versucht wird, es auf null zu setzen. Vielleicht sollten Sie versuchen, beide Fremdschlüssel auf '-> onDelete ('cascade') zu setzen;' Wenn also entweder der Benutzer oder die Rolle gelöscht wird, werden alle zugehörigen Zuordnungen ebenfalls für Sie gelöscht. –

+0

Gute Eins! Ich werde es versuchen und Sie wissen lassen, ob es bald funktioniert. – Markinson

Verwandte Themen