Laravel Migration表已经存在,但我想添加新的而不是旧的

时间:2014-09-27 17:45:32

标签: php mysql laravel

我之前创建过用户表。现在我创建了一个新的迁移来在我的模式中创建一个新的books表。当我尝试运行命令

php artisan migrate

显示:

[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)

以下是我的新迁移表:

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

如何摆脱错误?

32 个答案:

答案 0 :(得分:52)

在v5.x中,您可能仍会遇到此问题。因此,首先尝试使用

手动删除相关表

php artisan tinker

然后

Schema::drop('books')

(并以q退出)

现在,您可以成功php artisan migrate:rollbackphp artisan migrate

如果反复发生这种情况,您应该检查迁移中的down()方法是否显示正确的表名。 (如果您更改了表名,可能会有问题。)

答案 1 :(得分:42)

你需要运行

php artisan migrate:rollback

如果还失败,只需进入并删除您可能必须执行的所有表,因为您的迁移表似乎搞砸了,或者当您运行上一次回滚时您的用户表没有丢弃该表。

编辑:

发生这种情况的原因是您之前运行了回滚,但代码中有一些错误或者没有删除表。然而,这仍然会弄乱laravel迁移表,就你而言,你现在没有推送用户表的记录。但是用户表已经存在,并且抛出此错误。

答案 2 :(得分:26)

我遇到了同样的麻烦。原因是迁移文件夹中的文件名与数据库中的迁移名称不匹配(请参阅迁移表)。它们应该是一样的。

答案 3 :(得分:9)

你也可以插入 Schema::create('books', function(Blueprint $table)以下代码Schema::drop('books');

答案 4 :(得分:8)

你可以使用     php artisan migrate:fresh 删除所有表然后迁移。 希望它有所帮助

答案 5 :(得分:7)

编辑:(对于laravel)

在laravel中处理项目时遇到此问题。我的表格搞砸了,需要频繁更改列。一旦表格出现,我就无法再运行php artisan migrate

我已经完成了以下问题 -

  1. 删除数据库中的表[每一个,包括迁移表]
  2. $ composer dump-autoload -o
  3. php artisan migrate
  4. 以前的评论,关于流明

    [好吧,很晚才到派对(可能是一个不同于我所寻找的派对)。我猛地摇头,大声尖叫,灰色头骨的优雅刚刚找到了解决方案。]

    我正在使用流明开发一个安静的应用程序,我是新手。这是我使用laraval和流明的第一个项目/实验。我的依赖 -

    "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"
    }
    

    无论如何,直到昨天晚上一切都很好,但突然phpunit开始抱怨已经存在的桌子。

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

    咄! Items表应该存在于数据库中,否则我应该如何保存项目!

    无论如何,问题只存在于测试类中,但奇怪的是不在浏览器中(我检查过chrome,firefox和postman改变标题)。我按预期获得了数据的JSON响应。

    我删除了数据库并使用大量migraterefreshrollback重新创建了数据库。一切都很好,但在phpunit

    出于绝望,我删除了我的迁移文件(当然我先备份了)然后点击了终端中的phpunit。同样的事情一遍又一遍。

    突然我想起我在phpunit.xml文件中放了一个不同的数据库名称,仅用于测试目的。我检查了那个数据库,猜猜是什么!有一个名为items的表。我手动删除了这个表,运行phpunit,一切正常。

    我正在记录我的经验,仅供将来参考,希望这可能有助于将来。

答案 6 :(得分:6)

我从没有使用迁移的人那里继承了一些真正糟糕的代码!?,所以手动将文件名粘贴到迁移中,忘记删除尾随的.php

尽管存在文件名和迁移匹配,但这导致了“表存在”错误。

2018_05_07_142737_create_users_table.php - 错误 2018_05_07_142737_create_users_table - 正确

答案 7 :(得分:4)

在搞乱外键约束后我遇到了类似的问题。我的一个表(注释)已经消失了,即使在MySQL中删除它之后仍然会返回(任务),阻止我运行:php artisan migrate/refresh/reset,这产生了上述42s01异常。

我要解决的问题是ssh into vagrant然后进入MySQL(vagrant ssh, mysql -u homestead -p secret),然后:DROP DATABASE homestead; Then CREATE DATABASE homestead; Then exit mysql and run: php artisan migrate`。

显然,这种解决方案不适用于不使用流浪者/宅基地的人。 不以任何方式声称这是一个正确的工作流程,但它解决了我的问题,看起来很像上面的问题。

答案 8 :(得分:4)

您可以删除所有表,但这不是一个好习惯,请尝试使用此命令

php artisan migrate:fresh

确保正确使用命名约定。我已经在laravel 5.7版本中测试过 当您的站点在服务器上时,不要尝试使用此命令很重要,因为它会丢弃所有信息。

答案 9 :(得分:3)

我认为我的回答会有所帮助。我也遇到了这个错误。然后我删除了特定的迁移文件,并尝试通过php artisan重新创建。

但是在我看到关于migation的laracast视频的1或2天之前得到这一点之前,我正在考虑回滚并迁移特定的表。出于某种原因,我删除了特定的迁移文件并尝试重新创建,但这样做我得到了:

  

[ErrorException]     include(C:\ wamp64 \ www \ laraveldeneme \ vendor \ composer /../../ database / migrations / 2017_01_09_082715_create_articles_table.php):无法打开流:没有这样的文件或目录

当我检查该文件时,我在autoload_classmap.php文件中看到了数组顶部的下面一行:

  

'CreateArticlesTable'=&GT; $ BASEDIR '/数据库/迁移/ 2017_01_09_083946_create_articles_table.php',

Altough回滚或删除迁移文件,与迁移文件相关的记录保留在composer autoload_classmap.php文件中。

为了解决这个问题,我在下面发现了一个我记不起来的作曲家命令。

composer dump-autoload

当我使用此代码时,与我删除的迁移文件相关的行已不存在。然后我跑了:

php artisan make:migration create_articles_table --create=articles

最后,我重新创建了具有相同名称的迁移文件

答案 10 :(得分:3)

删除数据库中的所有表格,然后

do this

php artisan migrate:refresh

编辑您的迁移文件

php artisan migrate:rollback
再次

php artisan migrate ^ _ ^

完成你的桌子!!

答案 11 :(得分:2)

回滚后检查表格,确保删除。

如果有问题,请从phpmyadmin等数据库应用程序手动删除表格(我正在使用sequel pro for mac)。

在迁移中纠正你的down方法。

注意:执行回滚然后迁移..不要使用migrate:refresh来注意错误在哪里。

之后,您可以使用新数据库进行测试。检测问题在哪里。

另请尝试阅读此question

答案 12 :(得分:2)

转到phpmyadmin并删除为laravel创建的数据库,然后再次创建它然后转到cmd(如果使用windows)root项目并输入php artisan migrate

答案 13 :(得分:2)

php artisan migrate:rollback 

检查解决方案:Laravel Official Solution

正如迁移guide中所述,为了解决这个问题,您只需编辑app \ Providers \ AppServiceProvider.php文件并在boot方法中设置默认字符串长度:

use Illuminate\Support\Facades\Schema;

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

执行上述命令后,您需要手动删除所有剩余的表,然后运行命令:

php artisan migrate:fresh

答案 14 :(得分:1)

答案很简单:

首先备份文件夹引导程序/缓存。

然后从bootstrap / cache文件夹中删除所有文件。

现在运行:

php artisan migrate 

答案 15 :(得分:1)

  1. 在phpmyadmin手动删除所有表格。

  2. 转到数据库/迁移的每个迁移文件。查找并删除这两个代码:

    a) - &gt; index()(在第17行的2014_10_12_100000_create_password_resets_table.php找到)

    b) - &gt; unique()(在第19行的2014_10_12_000000_create_users_table.php找到)

  3. 运行“php artisan migrate”。

  4. 完成。

  5. 我认为这是因为最新的laravel类(2018年2月12日)删除了 - &gt; index()和 - &gt; unique()的功能。

答案 16 :(得分:1)

我通过删除&#34;用户&#34;解决了您的问题sequel-pro中的表(我的用户表中没有数据)然后你可以运行php artisan migrate

这是屏幕截图之前和之后

删除用户表用户

之前

enter image description here

删除表用户后

enter image description here

答案 17 :(得分:1)

  1. 删除所有表数据库
  2. 更新文件夹数据库/迁移/中的两个文件: 2014_10_12_000000_create_users_table.php, 2014_10_12_100000_create_password_resets_table.php
  3. 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();
    });
    

答案 18 :(得分:1)

将此添加到 AppServiceProvider.php

use Illuminate\Support\Facades\Schema;
public function boot() {
    Schema::defaultStringLength(191);
}

答案 19 :(得分:1)

首先删除数据库中的users表。然后转到命令propmt并键入

php artisan migrate

所有集合。我认为这个答案有帮助。

答案 20 :(得分:0)

编辑AppServiceProvider.php将在app / Providers / AppServiceProvider.php找到并添加

use Illuminate\Support\Facades\Schema;

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

然后运行

composer update

在您的终端上。 它对我有帮助,也可能对你有用。

答案 21 :(得分:0)

在创建表格之前,您始终可以检查表格是否存在。

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

答案 22 :(得分:0)

删除所有数据库表并通过CMD在项目路径中运行此行

php artisan migrate

答案 23 :(得分:0)

在laravel 5.4中,如果您遇到此问题。 Check this link

-OR -

转到app / Providers / AppServiceProvider.php中的此页面 并在下面添加代码

use Illuminate\Support\Facades\Schema;

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

答案 24 :(得分:0)

创建数据库实际上需要几秒钟。 如果有敏感数据,请导出当前数据库。 检查您的迁移并消除其中所有错误的方法。 删除数据库。 重新创建数据库。 PHP的工匠迁移 然后,您可以返回先前在数据库中的数据。 工作!

答案 25 :(得分:0)

我也遇到了这个问题,只是在Youtube Video上遇到了这个答案。不确定它是否理想,但这是我见过的最好的。

通过给Schema一个长度来似乎提供者目录的AppServiceProvider.php文件。在这种情况下,191。像魔术一样运作。Screenshot。然后,他跑了:php artisan migrate:fresh。希望这行得通。

答案 26 :(得分:0)

我也面临着相同的问题,我遵循相同的过程,但是我的问题没有解决,因此我尝试了另一件事。我从数据库中删除了表,并使用头文件

use Illuminate\Support\Facades\Schema;

并增加引导方法中的默认字符串长度以添加此内容:-

Schema::defaultStringLength(191);

然后再次迁移。问题已解决,所有表均在数据库中创建。

答案 27 :(得分:0)

我遇到了同样的问题,问题在于保存在数据库内部表迁移中的名称,因为在更改了有效文件的名称后,数据库中存在2017_10_18_200000_name和文件2016_10_18_200000_name

答案 28 :(得分:0)

解决方案:Laravel迁移表已存在... || 它也可以在 Laravel 5.8 中使用

  

app \ Providers \ AppServiceProvider.php文件

并在启动方法内设置默认字符串长度:

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

并打开

  

config \ database.php

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

并将其更改为

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

保存所有文件并转到命令提示符

php artisan migrate

答案 29 :(得分:0)

首先检查数据库中的迁移表,并确保项目中数据库文件夹中的迁移文件与此表数据相同。有时,如果您手动创建迁移文件,则在composer中运行migration命令时会出现此错误。

答案 30 :(得分:0)

危险 -这些答案大多数都会擦除您的数据库,不建议用于生产环境。

很明显,有很多针对此问题的“解决方案”,但是我阅读的所有这些解决方案都是非常具有破坏性的解决方案,并且都不适用于生产数据库。根据解决方案的数量,似乎也可能有多种原因导致此错误。

我的错误是由我的迁移表中的条目缺失引起的。我不确定它是怎么发生的,但是通过重新添加它,我不再收到错误。

答案 31 :(得分:0)

如果必须删除无法创建的表,会非常烦人。所以我做了一个简单的逻辑,在创建新表之前删除表

if(Schema :: hasTable('nama_table')){Schema :: dropIfExists('nama_table'); }

if (Schema::hasTable('books'))
{
    Schema::dropIfExists('books');
}

Schema::create('books', function(Blueprint $table)
{
   $table->increments('id');
   $table->string('name');
   $table->string('auther');
   $table->string('area');
   $table->timestamps();

});