Ich habe eine Tabelle mit folgender Migration erstellt:
public function up()
{
Schema::create('despatch_discrepancies', function($table) {
$table->increments('id')->unsigned();
$table->integer('pick_id')->unsigned();
$table->foreign('pick_id')->references('id')->on('picks');
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->integer('original_qty')->unsigned();
$table->integer('shipped_qty')->unsigned();
});
}
public function down()
{
Schema::drop('despatch_discrepancies');
}
Ich muss diese Tabelle ändern und die Fremdschlüsselreferenz & Spalte pick_detail_id
löschen und eine neue varchar-Spalte hinzufügen, die sku
nach der pick_id
Spalte aufgerufen wird.
Also habe ich eine weitere Migration erstellt, die folgendermaßen aussieht:
public function up()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->dropForeign('pick_detail_id');
$table->dropColumn('pick_detail_id');
$table->string('sku', 20)->after('pick_id');
});
}
public function down()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->dropColumn('sku');
});
}
Wenn ich diese Migration ausführe, wird folgende Fehlermeldung angezeigt:
[Illuminate \ Database \ QueryException]
SQLSTATE [HY000]: Allgemeiner Fehler: 1025 Fehler beim Umbenennen von './dev_iwms_reboot/despatch_discrepancies' in './dev_iwms_reboot/#sql2-67c-17c464' (Fehler: 152) (SQL: alter table)despatch_discrepancies
Fremdschlüssel löschen pick_detail_id)[PDOException]
SQLSTATE [HY000]: Allgemeiner Fehler: 1025 Fehler beim Umbenennen von './dev_iwms_reboot/despatch_discrepancies' in './dev_iwms_reboot/#sql2-67c-17c464' (Fehler: 152)
Wenn ich versuche, diese Migration durch Ausführen eines php artisan migrate:rollback
Befehls rückgängig zu machen , wird eine Rolled back
Meldung angezeigt, die jedoch in der Datenbank nichts bewirkt.
Irgendeine Idee, was falsch sein könnte? Wie löscht man eine Spalte mit einer Fremdschlüsselreferenz?
quelle
Es stellt sich heraus; Wenn Sie einen Fremdschlüssel wie folgt erstellen:
Laravel benennt die Fremdschlüsselreferenz eindeutig wie folgt:
Wenn Sie eine Spalte mit Fremdschlüsselreferenz löschen möchten, müssen Sie dies folgendermaßen tun:
Aktualisieren:
Laravel 4.2+ führt eine neue Namenskonvention ein:
quelle
<table_name>_<column_name>_foreign
Konvention scheint immer noch für 5.1 zu funktionieren$table->dropIndex('column_name')
.Ich hatte mehrere Fremdschlüssel in meiner Tabelle und musste dann nacheinander Fremdschlüsseleinschränkungen entfernen, indem ich den Spaltennamen als Index des Arrays in der Down-Methode übergab:
Die Verwendung der folgenden Anweisung funktioniert nicht
Da dropForeign sie nicht als separate Spalten betrachtet, die wir entfernen möchten. Also müssen wir sie einzeln fallen lassen.
quelle
$table->dropIndex('column_name')
.Übergeben Sie ein Array mit dem Spaltennamen
quelle
Der Schlüssel (für mich) zur Lösung dieses Problems bestand darin, sicherzustellen, dass dem Befehl $ table-> dropForeign () der richtige Beziehungsname übergeben wurde, nicht unbedingt der Spaltenname. Sie nicht wollen , die Spaltennamen zu übergeben, wie es wäre viel intuitiver IMHO.
Was für mich funktioniert hat war:
Die Zeichenfolge, die ich an dropForeign () übergeben habe und die für mich funktioniert hat, hatte folgendes Format:
[lokale Tabelle] _ [Fremdschlüsselfeld] _foreign
Wenn Sie Zugriff auf ein Tool wie Sequel Pro oder Navicat haben, ist es sehr hilfreich, diese zu visualisieren.
quelle
Mir fiel ein, dass ich nicht wusste, wo ich den
Schema::table
Block platzieren sollte.Später stellte ich fest, dass sich der Schlüssel im SQL-Fehler befindet:
Der
Schema::table
Block muss also in derdown()
Funktion derlu_benefits_categories
Migration und vor derSchema::dropIfExists
Zeile stehen:Danach macht das
php artisan migrate:refresh
oderphp artisan migrate:reset
den Trick.quelle