web-dev-qa-db-fra.com

Le tableau de migration Laravel existe déjà, mais je souhaite ajouter un nouveau fichier, pas l'ancien

J'ai précédemment créé la table des utilisateurs. Maintenant, j'ai créé une nouvelle migration pour créer une nouvelle table de livres dans mon schéma. Quand j'essaye de lancer la commande

php artisan migrate

Ça montre:  

[Illuminate\Database\QueryException]
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' alre
ady exists (SQL: create table `users` (`id` int unsigned not null auto_incr
ement primary key, `username` varchar(255) not null, `email` varchar(255) n
ot null, `password` varchar(255) not null, `created_at` timestamp default 0
 not null, `updated_at` timestamp default 0 not null) default character set
 utf8 collate utf8_unicode_ci)

Voici ma nouvelle table de migration:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBooksTable extends Migration {
    public function up()
    {
        Schema::create('books', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('auther');
            $table->string('area');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('books');
    }
}

Comment puis-je me débarrasser de l'erreur?

48
MD. Atiqur Rahman

Vous devez courir

php artisan migrate:rollback

si cela échoue également, il vous suffit d’abandonner toutes les tables que vous devrez peut-être traiter, car il semble que votre table de migration soit perturbée ou que votre table utilisateur lors de l’exécution d’une précédente restauration n’a pas été supprimée.

MODIFIER:

La raison en est que vous avez déjà effectué une restauration et que le code contenait une erreur ou que la table n'a pas été supprimée. Cependant, cela perturbe toujours la table de migration laravel et, en ce qui concerne cette tâche, vous n’avez plus aucune trace de remonter la table utilisateur. La table utilisateur existe déjà cependant et cette erreur est renvoyée.

39
mschuett

J'ai eu le même problème. La raison en est que votre nom de fichier dans le dossier migrations ne correspond pas à nom de migration dans votre base de données (voir le tableau des migrations). Ils devraient être les mêmes.

25
Abaza

Vous pouvez aussi insérer avant Schema::create('books', function(Blueprint $table) le code suivant Schema::drop('books');

9
Trikly

EDIT: (pour laravel)

Je suis tombé sur ce problème alors que je travaillais sur un projet à Laravel. Mes tables étaient en désordre, nécessitant de fréquentes modifications de colonnes. Une fois les tables installées, je n’étais plus capable de lancer php artisan migrate.

J'ai fait suite pour me débarrasser de la question-

  1. Supprimer les tables de la base de données [toutes les tables, y compris la table de migration]
  2. $ composer dump-autoload -o
  3. php artisan migrate

Commentaire précédent concernant le lumen

[Et bien, assez tard pour la fête (et peut-être une fête différente de celle que je cherchais). Je me suis cogné la tête, j'ai crié à haute voix et, par la grâce du crâne gris, j'ai trouvé une solution.]

Je développe une application reposante en utilisant Lumen et je suis novice dans ce domaine. Ceci est mon premier projet/expérience utilisant laraval et Lumen. Mes dépendances

"require": {
    "php": ">=5.6.4",
    "laravel/Lumen-framework": "5.4.*",
    "vlucas/phpdotenv": "~2.2",
    "barryvdh/laravel-cors": "^0.8.6",
    "league/fractal": "^0.13.0"
},
"require-dev": {
    "fzaninotto/faker": "~1.4",
    "phpunit/phpunit": "~5.0",
    "mockery/mockery": "~0.9.4"
}

Quoi qu'il en soit, tout allait bien jusqu'à hier soir mais tout à coup, phpunit a commencé à se plaindre d'une table déjà existante.

Caused by
PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'items' already exists

Duh! La table Items devrait exister dans la base de données, sinon, comment suis-je censé enregistrer des éléments! 

Quoi qu'il en soit, le problème persiste seulement dans les classes de test, mais étrangement pas dans le navigateur (j'ai vérifié avec les en-têtes chrome, firefox et postman). J'obtenais les réponses JSON avec les données attendues.

J'ai abandonné la base de données et l'ai recréée avec beaucoup de migrate, refresh, rollback. Tout allait bien mais dans phpunit.

En désespoir de cause, j'ai supprimé mes fichiers de migration (bien sûr, j'ai d'abord effectué une sauvegarde), puis cliqué sur phpunit dans le terminal. Même chose encore une fois.

Tout à coup, je me suis rappelé que j'avais mis un nom de base de données différent dans le fichier phpunit.xml uniquement à des fins de test. J'ai vérifié cette base de données et devinez quoi! Il y avait une table nommée items. J'ai supprimé cette table manuellement, lancez phpunit, tout a bien fonctionné.

Je documente mon expérience pour des références futures uniquement et j'espère que cela pourra aider quelqu'un à l'avenir.

7
maksbd19

J'ai hérité d'un mauvais code de quelqu'un qui n'utilisait pas les migrations!?, Afin de coller manuellement les noms de fichiers dans les migrations, en oubliant de supprimer le .php final.

Cela a donc provoqué l'erreur 'table existe' malgré le nom du fichier et la correspondance de la migration.

2018_05_07_142737_create_users_table.php - WRONG 2018_05_07_142737_create_users_table - CORRECT

6
Nik K

Vous pouvez utiliser php artisan migrate:fresh pour supprimer toutes les tables et migrer ensuite ...__

6
user8810865

J'ai eu un problème similaire après avoir joué avec les contraintes de clé étrangère. Un de mes tableaux (notes) avait disparu et un autre revenait (tâches) même après l'avoir laissé tomber dans MySQL, m'empêchant de lancer: php artisan migrate/refresh/reset, qui produisait l'exception 42s01 ci-dessus.

Ce que j’ai fait pour le résoudre était ssh en vagrant, puis dans MySQL (vagrant ssh, mysql -u Homestead -p secret), puis: DROP DATABASE Homestead; Then CREATE DATABASE Homestead; Then exit mysql and run:php artisan migrate`.

Évidemment, cette solution ne fonctionnera pas pour les personnes n'utilisant pas vagrant/Homestead . Ne prétendant d'aucune façon que ce soit un flux de travail correct, mais cela a résolu mon problème, qui ressemble beaucoup à celui ci-dessus. 

vous déposez tous les tabel dans votre base de données, puis 

 do this

php artisan migrate:refresh

éditer votre fichier de migration 

php artisan migrate:rollback

php artisan migrate encore ^ _ ^

fait votre table !!

3
Fikri Zufri

Je pense que ma réponse aidera plus. J'ai aussi fait face à cette erreur. Ensuite, j'ai supprimé un fichier de migration spécifique et essayé de recréer par php artisan. 

Mais avant d’obtenir ce point il ya 1 ou 2 jours, alors que je regardais des vidéos de laracast sur la migation, je pensais revenir en arrière et migrer un tableau spécifique. Pour une raison quelconque, j'ai supprimé un fichier de migration spécifique et essayé de recréer, mais ce faisant, j'ai obtenu:

[ErreurException] include (C:\wamp64\www\laraveldeneme\vendor\composer /../../ base de données/migrations/2017_01_09_082715_create_articles_table.php): impossible d'ouvrir le flux: aucun fichier ni répertoire

Quand j'ai vérifié ce fichier, j'ai vu la ligne ci-dessous en haut du tableau dans le fichier autoload_classmap.php:

'CreateArticlesTable' => $ baseDir. '/ Database/migrations/2017_01_09_083946_create_articles_table.php',

Malgré la restauration ou la suppression d'un fichier de migration, l'enregistrement associé au fichier de migration reste dans le fichier composer autoload_classmap.php. 

Pour résoudre ce problème, j'ai trouvé la commande composer ci-dessous, dont je ne me souviens plus.

composer dump-autoload

Lorsque je Rand ce code, la ligne liée au fichier de migration que j'ai supprimé est parti. Puis j'ai couru:

php artisan make:migration create_articles_table --create=articles

Enfin, j'ai recréé mon fichier de migration avec le même nom

3
Aydın Bulut

allez dans phpmyadmin et déposez la base de données que vous avez créée pour Laravel puis créez-la à nouveau, puis accédez à cmd (si vous utilisez Windows), saisissez le projet racine et tapez php artisan migrate.

2
Silvanas

Après la restauration, vérifiez vos tables, assurez-vous de les supprimer.

S'il y a un problème, supprimez manuellement les tables de l'application de base de données comme phpmyadmin (j'utilise Sequel Pro pour Mac).

Corrigez vos méthodes de down dans la migration.

Remarque: effectuez une restauration puis effectuez une migration. N'utilisez pas migrate: refresh pour remarquer l'emplacement de l'erreur.

Après cela, vous pourrez tester avec une nouvelle base de données. détecter où est le problème.

Essayez aussi de lire cette question

2
Hos Mercury
php artisan migrate:rollback 

Solution de vérification: Solution officielle de Laravel

Comme indiqué dans le document Migrations guide , pour résoudre ce problème, il vous suffit de modifier votre fichier app\Providers\AppServiceProvider.php et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Après la commande ci-dessus, vous devez supprimer toutes les tables restantes manuellement, puis exécuter la commande:

php artisan migrate:fresh
2
flik

Vous pouvez supprimer toutes les tables mais ce ne sera pas une bonne pratique, essayez plutôt cette commande

php artisan migrate:fresh

Assurez-vous d'utiliser correctement la convention de dénomination. J'ai testé cela dans la version laravel 5.7 Il est important de ne pas essayer cette commande lorsque votre site est sur le serveur car il supprime toutes les informations.

2
Murad

Commencez par déposer la table des utilisateurs dans la base de données. Ensuite, allez à l'invite de commande et tapez 

php artisan migrate

tous les ensembles.Je pense que cette réponse aide.

1
srilaxmi

Ajouter ceci à AppServiceProvider.php

use Illuminate\Support\Facades\Schema;
public function boot() {
    Schema::defaultStringLength(191);
}
1
ntsasng
  1. Supprimez toutes les tables manuellement à la phpmyadmin.

  2. Accédez à chaque fichier de migration dans la base de données/migrations. Recherchez et supprimez ces 2 codes:

    a) -> index () (trouvé à 2014_10_12_100000_create_password_resets_table.php à la ligne 17)

    b) -> unique () (trouvé à 2014_10_12_000000_create_users_table.php à la ligne 19)

  3. Exécutez "php artisan migrate".

  4. Terminé.

Je pense que cela se produit car la dernière classe laravel (au 12 février 2018) a supprimé la fonction -> index () et -> unique ().

1
Master Jowin

J'ai résolu votre problème en supprimant la table "utilisateur" dans sequel-pro (il n'y a pas de données dans ma table utilisateur) et vous pouvez ensuite exécuter php artisan migrate

Voici avant et après les captures d'écran

avant de supprimer l'utilisateur de la table utilisateur

 enter image description here

après avoir supprimé la table user  enter image description here

1
windtalker
  1. Supprimer toute la base de données de la table
  2. Mettez à jour deux fichiers dans le dossier database/migrations /: 2014_10_12_000000_create_users_table.php, 2014_10_12_100000_create_password_resets_table.php

2014_10_12_100000_create_password_resets_table.php

Schema::create('password_resets', function (Blueprint $table) {
     $table->string('email');
     $table->string('token');
     $table->timestamp('created_at')->nullable();
});

2014_10_12_000000_create_users_table.php

Schema::create('users', function (Blueprint $table) {
     $table->increments('id');
     $table->string('name');
     $table->string('email');
     $table->string('password');
     $table->rememberToken();
     $table->timestamps();
});
1
Jacksonit.org

J'étais également confronté au même problème, j'ai suivi le même processus mais mon problème n'était pas résolu alors j'essayais autre chose. J'ai supprimé les tables de ma base de données et utilise un fichier d'en-tête 

use Illuminate\Support\Facades\Schema;

et augmentez la longueur de chaîne par défaut dans la méthode de démarrage pour ajouter ceci: -

Schema::defaultStringLength(191);

puis à nouveau migrer. Le problème est résolu, toutes les tables sont créées dans la base de données.

0
Gaurav Jain

Dans laravel 5.4, Si vous rencontrez ce problème. Vérifiez ce lien

-ou-

Allez sur cette page dans app/Providers/AppServiceProvider.php Et ajoutez le code ci-dessous

use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}
0
Sameera Liyanage

J'ai eu le même problème, le problème est dans le nom enregistré dans la table migrations à l'intérieur de la base de données, parce que dans ma base de données existe 2017_10_18_200000_name et dans les fichiers 2016_10_18_200000_name, après avoir changé le nom du fichier qui fonctionne.

0
I.Yan

DANGER- la plupart de ces réponses effaceront votre base de données et ne sont pas recommandées pour une utilisation en production.

Il est clair qu'il existe de nombreuses "solutions" à ce problème, mais toutes ces solutions que j'ai lues sont des solutions très destructrices et aucune d'entre elles ne fonctionne pour une base de données de production. Sur la base du nombre de solutions, il semble également que cette erreur pourrait avoir plusieurs causes.

Mon erreur était due à une entrée manquante dans ma table des migrations. Je ne sais pas exactement comment cela s'est passé, mais en le rajoutant, je n'ai plus reçu l'erreur.

0
Jase

Modifier AppServiceProvider.php se trouvera à app/Providers/AppServiceProvider.php et ajouter

use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}

Puis courir 

composer update

Sur votre terminal ... Cela m'a aidé, peut-être que cela fonctionnera aussi pour vous.

0
S.M Talha

Supprimer toutes les tables de base de données et exécuter cette ligne dans votre chemin de projet via CMD

php artisan migrate
0
Maijied Hasan Shuvo

J'ai aussi eu ce problème, je viens de trouver cette réponse sur Youtube Video . Je ne sais pas si c'est idéal, mais c'est le meilleur que j'ai vu.

Semble le fichier AppServiceProvider.php du répertoire des fournisseurs en donnant une longueur au schéma. Dans ce cas, 191. Fonctionne comme par magie. Capture d'écran . Il a ensuite lancé: php artisan migrate:fresh. J'espère que ça marche.

0
Smitho

Commencez par vérifier la table migrations dans votre base de données et assurez-vous que vos fichiers de migration dans le dossier de la base de données de votre projet sont égaux à ceux de cette table. Parfois, si vous créez manuellement des fichiers de migration, cette erreur apparaît lorsque vous exécutez la commande migrate dans composer.

0
Masoud Rezaei

Vous pouvez toujours vérifier l'existence d'une table avant de la créer.

    if(!Schema::hasTable('books')){
 Schema::create('books', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('auther');
            $table->string('area');
            $table->timestamps();
        });
}
0
Cengkuru Michael

La création d'une base de données prend littéralement des secondes ........ Exportez votre base de données actuelle au cas où elle contiendrait des données sensibles . Vérifiez vos migrations et éliminez toutes les méthodes incorrectes qu'il contient . __. php artisan migrate Ensuite, vous pouvez renvoyer les données précédemment dans la base de données . Fonctionne !!!

0
Shisha

Solution: Le tableau de migration Laravel existe déjà ... || Cela fonctionne dans Laravel 5.8 aussi

fichier app\Providers\AppServiceProvider.php

et dans la méthode de démarrage, définissez une longueur de chaîne par défaut:

public function boot()
{
    Schema::defaultStringLength(191);
}

et ouvert

config\database.php

'charset' =>'utf8mb4',
'collation' =>'utf8mb4_unicode_ci',

et changez-le en

'charset' =>'utf8',
'collation' =>'utf8_unicode_ci',

enregistrer tous les fichiers et aller à la commande Invite

php artisan migrate
0
Zaheer Sadique