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?

Benutzer-Avatar
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

Benutzer-Avatar
Dreher

Es stellt sich heraus; Wenn Sie einen Fremdschlüssel wie folgt erstellen:

$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');

Laravel benennt die Fremdschlüsselreferenz eindeutig wie folgt:

<table_name>_<foreign_table_name>_<column_name>_foreign
despatch_discrepancies_pick_detail_id_foreign (in my case)

Wenn Sie also eine Spalte mit Fremdschlüsselbezug löschen möchten, müssen Sie dies folgendermaßen tun:

$table->dropForeign('despatch_discrepancies_pick_detail_id_foreign');
$table->dropColumn('pick_detail_id');

Aktualisieren:

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

$table->dropForeign(['country_id','stateprovince_id','city_id']); 

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


Benutzer-Avatar
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.

Was für mich funktionierte, war:

$table->dropForeign('local_table_foreign_id_foreign');
$table->column('foreign_id');

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.

Benutzer-Avatar
Filip Mansano

auf Laravel 8 verwenden dropConstrainedForeignId
(https://github.com/laravel/framework/pull/34806)

<?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');
        });
    }
}

Benutzer-Avatar
Riki Krismawan

Sie können die Beziehungs-ID zuerst deaktivieren

Schema::disableForeignKeyConstraints();

1358520cookie-checkSpalte mit Fremdschlüssel löschen Laravel-Fehler: Allgemeiner Fehler: 1025 Fehler beim Umbenennen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy