1
votes

Suppression de la clé étrangère d'index non signée dans laravel. Erreur de syntaxe ou violation d'accès: 1091 Can't DROP; vérifier que la colonne / clé existe

J'ai créé la migration en utilisant le

Schema::table('packages', function (Blueprint $table) {
      $table->dropForeign('star_id');
      //$table->dropIndex('star_id'); //also tried dropIndex
      $table->dropColumn('star_id');
 });

suivant dans la partie de dépôt

Schema::table('packages', function (Blueprint $table) {
     $table->integer('star_id')->unsigned()->index()->nullable()->default(null);
     $table->foreign('star_id')->references('id')->on('star');
});

mais cela lance pour index et étranger

SQLSTATE [HY000]: Erreur générale: 1553 Impossible de supprimer l'index 'packages_star_id_index': nécessaire dans une contrainte de clé étrangère (SQL: alter table packages drop star_id )

erreur pour dropForeign

SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1091 Can't DROP 'star_id'; vérifier que la colonne / clé existe (SQL: alter table packages déposer la clé étrangère star_id )

Je ne peux pas revenir en arrière à cause de l'erreur.


0 commentaires

3 Réponses :


1
votes

Vous devez transmettre le nom de la clé étrangère vous-même ou transmettre le nom de la colonne dans un tableau pour que laravel le construise automatiquement.

Voir ici :

Si l '"index" donné est en fait un tableau de colonnes, le développeur signifie supprimer un index simplement en spécifiant les colonnes impliquées sans le nom conventionnel, nous allons donc construire le nom de l'index à partir de les colonnes.

Schema::table('packages', function (Blueprint $table) {
    $table->dropForeign(['star_id']);
    $table->dropColumn('star_id');
});

Dans votre cas, passez simplement la colonne dans un tableau:

// laravel assumes star_id is the foreign key name
$table->dropForeign('star_id'); 

// laravel builds the foreign key name itself e.g. packages_star_id_foreign
$table->dropForeign(['star_id']);


0 commentaires

0
votes

Basé sur la documentation Laravel 7, pour déposer une clé étrangère ce code fonctionnera:

$table->dropForeign(['user_id']);

dans lequel "posts" est le nom de la table, "user_id" est le nom de la clé étrangère et "étranger" est le suffixe.

Il y a également une autre méthode qui ne transmet que le nom de la clé étrangère dans un tableau comme celui-ci:

$table->dropForeign('posts_user_id_foreign');

cette image provient du site Web de Laravel (v 7.x): ici


0 commentaires

1
votes

Blockquote SQLSTATE [HY000]: Erreur générale: 1553 Impossible de supprimer l'index 'packages_star_id_index': nécessaire dans une contrainte de clé étrangère (SQL: alter table packages drop star_id)

Selon votre erreur, le nom de l'index était "packages_star_id_index". vous devez mentionner le nom d'index correct dans la fonction dropForeign.

essayez:

Schema::table('packages', function (Blueprint $table) {
      $table->dropForeign('packages_star_id_index');
      $table->dropColumn('star_id');
 });

0 commentaires