Spalte mit Fremdschlüssel löschen Laravel-Fehler: Allgemeiner Fehler: 1025 Fehler beim Umbenennen
Lesezeit: 7 Minuten
Ich habe eine Tabelle mit Migration wie folgt 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 und -spalte löschen pick_detail_id und fügen Sie eine neue varchar-Spalte namens hinzu sku nach pick_id Säule.
Also habe ich eine weitere Migration erstellt, die so 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, erhalte ich die folgende Fehlermeldung:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: Allgemeiner Fehler: 1025 Fehler beim Umbenennen von „./dev_iwms_reboot/despatch_discrepancies“ in „./dev_iwms_reboot/#sql2-67c-17c464“ (Fehlernummer: 152) (SQL: alter table despatch_discrepancies drop Fremdschlüssel 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’ (Fehlernummer: 152)
Wenn ich versuche, diese Migration durch Ausführen rückgängig zu machen php artisan migrate:rollback Befehl, bekomme ich a Rolled back Nachricht, aber es tut eigentlich nichts in der Datenbank.
Irgendeine Idee, was falsch sein könnte? Wie löschen Sie eine Spalte, die eine Fremdschlüsselreferenz hat?
Alex Pineda
Sie können dies verwenden:
Schema::table('despatch_discrepancies', function (Blueprint $table) {
$table->dropForeign(['pick_detail_id']);
$table->dropColumn('pick_detail_id');
});
Wenn Sie bei dropForeign source einen Höhepunkt erreichen, wird der Indexname des Fremdschlüssels für Sie erstellt, wenn Sie den Spaltennamen als Array übergeben.
Die akzeptierte Antwort funktioniert auch: Sie müssen die richtige Indexnamenskonvention verwenden. Aber das ist auch das Problem bei dieser Antwort: Sie müssen sich das Namensschema für Indizes merken, während diese Lösung dies automatisch tut! Ich habe immer den anderen Weg benutzt und mich immer darüber beschwert, wie unpraktisch es ist. Jetzt steige ich sofort auf diese Lösung um. Vielen Dank!
– Marco Pallante
16. Juli 2015 um 15:48 Uhr
Toller Trick. Ich habe es den langen Weg wie ein Trottel gemacht. Laravel könnte wirklich Hilfe bei den Dokumenten gebrauchen. Vielleicht nehme ich die Herausforderung an…
– Simonhamp
13. Dezember 2015 um 1:03 Uhr
Hat bei mir in Laravel 5.0 funktioniert. Vielen Dank, Alex!
– SilithCrowe
20. Januar 2016 um 18:15 Uhr
Funktionierte wie ein Zauber in Laravel 5.2.
– Sohn Tran
23. März 2016 um 7:30 Uhr
Das ist ein netter Trick. Viel freundlicher, als sich an die Benennungskonvention für Fremdschlüssel zu erinnern (die sich in Zukunft ändern könnte). Wie @ronin1184 sagte, funktioniert es perfekt in Laravel 5.2
– Robin van Baalen
17. Juni 2016 um 16:07 Uhr
Dreher
Es stellt sich heraus; Wenn Sie einen Fremdschlüssel wie folgt erstellen:
Laravel 4.2+ führt eine neue Namenskonvention ein:
<table_name>_<column_name>_foreign
Aktualisieren:
Larave > 8.x führt eine neue Funktion ein
dropConstrainedForeignId('pick_detail_id');
Dadurch wird die Spalte sowie der Fremdschlüssel der Spalte gelöscht
Funktioniert nicht in Laravel 4.2. ist nicht Teil des Schlüsselnamens. Es funktioniert nur mit __foreign.
– reich remer
3. April 2015 um 1:18 Uhr
Ich habe es in Laravel 4.2 verwendet und tue es immer noch, es funktioniert für mich.
– Dreher
12. Juni 2015 um 11:40 Uhr
Das <table_name>_<column_name>_foreign Konvention scheint immer noch für 5.1 zu funktionieren
– Yahya Uddin
25. Dezember 2015 um 15:43 Uhr
Anscheinend müssen Sie nach dem Löschen der Einschränkung für die Beziehung auch die Spalte löschen. Ich denke, die Dokumentation hätte das auch enthalten sollen, da man leicht davon ausgehen kann, dass dropForeign auch die Spalte löschen wird. danke fürs teilen. laravel.com/docs/5.0/schema#dropping-columns
– Picrasma
26. Juni 2016 um 15:15 Uhr
Falls sich jemand gefragt hat: Indizes, die MySQL automatisch für Fremdschlüssel erstellt, werden gelöscht, wenn die Spalten gelöscht werden. Sie müssen sie nicht manuell ablegen $table->dropIndex('column_name').
– Aleksandar
27. März 2019 um 8:46 Uhr
Ich hatte mehrere Fremdschlüssel in meiner Tabelle und musste dann die Fremdschlüsselbeschränkungen nacheinander entfernen, indem ich den Spaltennamen als Index des Arrays in der Down-Methode übergab:
public function up()
{
Schema::table('offices', function (Blueprint $table) {
$table->unsignedInteger('country_id')->nullable();
$table->foreign('country_id')
->references('id')
->on('countries')
->onDelete('cascade');
$table->unsignedInteger('stateprovince_id')->nullable();
$table->foreign('stateprovince_id')
->references('id')
->on('stateprovince')
->onDelete('cascade');
$table->unsignedInteger('city_id')->nullable();
$table->foreign('city_id')
->references('id')
->on('cities')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('offices', function (Blueprint $table) {
$table->dropForeign(['country_id']);
$table->dropForeign(['stateprovince_id']);
$table->dropForeign(['city_id']);
$table->dropColumn(['country_id','stateprovince_id','city_id']);
});
}
Die Verwendung der folgenden Anweisung funktioniert nicht
Weil dropForeign sie nicht als separate Spalten betrachtet, die wir entfernen möchten. Also müssen wir sie einzeln fallen lassen.
Danke, mein Freund, das Hinzufügen des Spaltennamens in einem Array funktioniert für mich.
–Pierre
16. Juli 2018 um 1:57 Uhr
Falls sich jemand gefragt hat: Indizes, die MySQL automatisch für Fremdschlüssel erstellt, werden gelöscht, wenn die Spalten gelöscht werden. Sie müssen sie nicht manuell ablegen $table->dropIndex('column_name').
– Aleksandar
27. März 2019 um 8:55 Uhr
ty, ich wollte Schema::table('offices', function (Blueprint $table) {} so schlecht…
– Akshay K. Nair
24. April 2021 um 17:01 Uhr
Aus irgendeinem Grund setzt Laravel den Tabellennamen und das Postfix ‘foreign’ in dropForeign nicht voran. also ich denke es sollte so sein: $table->dropForeign(['offices_country_id_foreign']);
– Sumit Wadhwa
9. Dezember 2021 um 15:33 Uhr
DirtyBirdNJ
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 machen nicht möchte den Spaltennamen übergeben, da dies IMHO viel intuitiver wäre.
Die Zeichenfolge, die ich an dropForeign() übergeben habe und die für mich funktioniert hat, hatte das folgende Format:
[local table]_[foreign key field]_ausländisch
Wenn Sie Zugriff auf ein Tool wie Sequel Pro oder Navicat haben, ist es sehr hilfreich, diese visualisieren zu können.
Etwas, das mir auffiel, war, dass ich nicht wusste, wo ich das hinlegen sollte Schema::table Block.
Später entdeckte ich, dass der Schlüssel auf dem SQL-Fehler liegt:
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`)
Also die Schema::table Block muss in die gehen down() Funktion der lu_benefits_categories Migration und vor der Schema::dropIfExists Linie:
public function down()
{
Schema::table('table', function (Blueprint $table) {
$table->dropForeign('table_category_id_foreign');
$table->dropColumn('category_id');
});
Schema::dropIfExists('lu_benefits_categories');
}
Danach die php artisan migrate:refresh oder php artisan migrate:reset wird den Trick machen.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddAddressFieldsInEventTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('events', function (Blueprint $table) {
$table->bigInteger('address_id')->nullable();
$table->foreign('address_id')
->references('id')
->on('addresses')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('events', function (Blueprint $table) {
$table->dropConstrainedForeignId('address_id');
$table->dropColumn('address_id');
});
}
}
Riki Krismawan
Sie können die Beziehungs-ID zuerst deaktivieren
Schema::disableForeignKeyConstraints();
13585200cookie-checkSpalte mit Fremdschlüssel löschen Laravel-Fehler: Allgemeiner Fehler: 1025 Fehler beim Umbenennenyes