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

我怎样才能消除这个错误?

219179 次浏览

你得快跑

php artisan migrate:rollback

如果这也失败了,只要进入并删除所有的表,你可能必须这样做,因为看起来你的迁移表是混乱的,或者你的用户表,当你运行以前的回滚没有删除表。

编辑:

之所以会发生这种情况,是因为您之前运行了一个回滚,它在代码中出现了一些错误,或者没有删除表。然而,这仍然搞乱了幼虫迁移表,就它而言,您现在没有将用户表向上推的记录。但是,用户表已经存在,并且此错误被抛出。

我也有同样的麻烦。原因是迁移文件夹中的 文件名与数据库中的 迁移名称不匹配(参见迁移表)。应该是一样的。

也可以在 以下代码为 Schema::drop('books');

在扰乱外键约束之后,我也遇到了类似的问题。我的一个表(注释)不见了,还有一个表(任务)继续返回(任务) ,甚至在把它放到 MySQL 中之后也是如此,这阻止了我运行: php artisan migrate/refresh/reset,它产生了上面的42s01异常。

我所做的就是将 ssh 变成流浪者,然后进入 MySQL (vagrant ssh, mysql -u homestead -p secret) ,然后: DROP DATABASE homestead; Then CREATE DATABASE homestead; Then exit mysql and run:php Artian shift’。

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

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

如果出现问题,从数据库应用程序中手动删除表,比如 phpmyadmin (我使用的是 mac 版的 Sequel pro)。

在迁移中更正您的 down 方法。

注意: 回滚然后迁移。不要使用迁移: 刷新来注意错误发生在哪里。

之后,您可以使用新的 db 进行测试,以检测问题出在哪里。

也尝试阅读此 有个问题

在 v5.x 中,您可能仍然面临这个问题

php artisan tinker

然后

Schema::drop('books')

(以 q退出)

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

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

我想我的回答会更有帮助。我也面对过这个错误。然后,我删除了特定的迁移文件,并试图通过 php Artisan 进行重新创建。

但是在一两天前我观看关于迁移的 Laracast 视频时,在得到这一点之前,我一直在考虑回滚和迁移特定的表。出于某种原因,我删除了特定的迁移文件,并尝试重新创建,但是我得到了:

[错误异常] Include (C: wamp64 www laraveldeneme 厂商作曲家/. ./. ./database//2017 _ 01 _ 09 _ 082715 _ create _ article _ table.php) : 未能打開流: 沒有這樣的文件或目錄

当我检查这个文件时,我在 autoload _ classmap.php 文件的数组顶部看到了下面这行:

“ CreateArticlesTable”= > $baseDir,

尽管可以回滚或删除迁移文件,但是与迁移文件相关的记录仍然保留在编写器 autoload _ classmap.php 文件中。

为了解决这个问题,我在下面找到了一个我不记得来自哪里的作曲家命令。

composer dump-autoload

当我打开这段代码时,与我删除的迁移文件相关的那一行就不见了,然后我运行:

php artisan make:migration create_articles_table --create=articles

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

我从一个没有使用迁移的人那里继承了一些非常糟糕的代码! ?,所以手动粘贴到迁移的文件名,忘记删除尾随。我不知道

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

2018 _ 05 _ 07 _ 142737 _ create _ users _ table.php-WRONG 2018 _ 05 _ 07 _ 142737 _ create _ users _ table-CORRECT

转到 phpmyadmin 并删除为 laravel 创建的数据库,然后再次创建它,然后转到 cmd (如果使用 windows) root project 并键入 php artian shift

编辑: (对于幼虫)

在幼虫期做项目的时候碰到了这个问题。我的表乱七八糟,需要频繁更改列。一旦有了表,我就不能再运行 php artisan migrate了。

我已经做了以下摆脱问题-

  1. 删除数据库中的表[每个表,包括迁移表]
  2. $ composer dump-autoload -o
  3. php artisan migrate

之前关于 Lumen 的评论

[好吧,派对已经很晚了(可能和我想要的派对不一样)。我撞了撞头,大声尖叫,借着灰色头骨的恩典,我终于找到了解决办法。]

我在用 Lumen 开发一个安静的应用,我还是个新手。这是我第一个使用幼虫和流明的项目/实验。我的依赖-

"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 和邮递员修改的标题进行了检查)。正如预期的那样,我得到了带有数据的 JSON 响应。

我丢弃了数据库,用大量的 migraterefreshrollback重新创建了它。除了 phpunit,一切都很好。

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

突然我想起来,我在 phpunit.xml文件中放入了一个不同的数据库名称,仅用于测试目的。我查了数据库,你猜怎么着!有一张桌子叫 items。我手动删除这个表,运行 phpunit,一切开始工作正常。

我记录我的经验只是为了将来的参考,并希望这可以帮助某人在未来。

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

do this

php artisan migrate:refresh

编辑迁移文件

php artisan migrate:rollback

又是 php artisan migrate ^ _ ^

做好你的桌子! !

首先在数据库中删除 users 表,然后转到 command promt 并键入

php artisan migrate

一切就绪,我觉得这个答案有帮助。

把这个加到 AppServiceProvider.php

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

在幼虫5.4,如果你有这个问题

或者

转到 app/Provider/AppServiceProvider.php 中的这个页面 并在下面添加代码

use Illuminate\Support\Facades\Schema;


public function boot()
{
Schema::defaultStringLength(191);
}
  1. 删除所有表数据库
  2. 更新数据库/迁移/文件夹中的两个文件: 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();
});

编辑 AppServiceProvider.php 可以在 app/Provider/AppServiceProvider.php 中找到,并添加

use Illuminate\Support\Facades\Schema;


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

那就快跑

composer update

在你的终端上。 它帮助了我,也许对你也有用。

我通过在 Sequel-pro 中删除“ user”表(我的用户表中没有数据)来解决您的问题,然后您可以运行 php artisan migrate

以下是截图前后的对比

在我删除用户表用户之前

enter image description here

在我删除表用户之后 enter image description here

  1. Phpmyadmin处手动删除所有表。

  2. 转到 database/migrations的每个 迁徙文件。找到并删除这两个代码:

    A)-> index ()(在2014 _ 10 _ 12 _ 100000 _ create _ password _ resets _ table.php 第17行找到)

    B)-> only ()(可在第19行的2014 _ 10 _ 12 _ 000000 _ create _ users _ table.php 中找到)

  3. 运行 php artisan migrate

  4. 成交。

我认为发生这种情况是因为最新的幼虫类(2018年2月12日)已经去除了 ->index()->unique()的功能

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

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

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

php artisan migrate

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

php artisan migrate:rollback

检查解决方案: Laravel 官方解决方案

正如在偏移 向导中描述的那样,要解决这个问题,你所要做的就是编辑你的应用程序提供商 AppServiceProvider.php 文件,并在启动方法中设置一个默认的字符串长度:

use Illuminate\Support\Facades\Schema;


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

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

php artisan migrate:fresh

创建一个数据库只需要几秒钟。

导出当前数据库,以防其中包含敏感数据。

检查您的迁移并消除其中的所有错误方法。

删除数据库 和 < strong > 重新创建数据库。

php artisan migrate

然后可以返回数据库中以前的数据。

您可以删除所有的表,但这不是一个好的做法,请尝试执行以下命令

php artisan migrate:fresh

确保正确使用变数命名原则,我已经在 laravel5.7版本中测试过了 当站点位于服务器上时,一定不要尝试此命令,因为它会删除所有信息。

我也有这个问题,只是在 Youtube 视频上看到了这个答案。不知道是否理想,但这是我见过最好的。

通过给模式一个长度,看起来像是提供程序目录的 AppServiceProvider.php文件。在这种情况下 191。就像魔法一样 截图。然后他跑了: php artisan migrate:fresh。希望能成功。

我也面临同样的问题,我遵循同样的过程,但我的问题没有解决,所以我尝试另一件事情。我从数据库中删除了这些表,并使用了一个头文件

use Illuminate\Support\Facades\Schema;

并在 boot方法中增加默认字符串长度,以添加以下内容:

Schema::defaultStringLength(191);

问题解决后,所有的表都在数据库中创建。

问题是名称保存在数据库中的表迁移,因为在我的数据库中存在 2017_10_18_200000_name和文件 2016_10_18_200000_name,更改后的文件名称工作。

所以请不要为迁移文件更改文件的名称,因为根据上次迁移,名称必须相同。

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

提供程序 AppServiceProvider.php 文件

在 boot 方法中设置默认字符串长度:

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

打开

Config database. php

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

并将其改为

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

保存所有文件并进入命令提示符

php artisan migrate

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

DANGER -这些答案中的大多数都会清除您的数据库,不推荐在生产环境中使用。

很明显,对于这个问题有很多“解决方案”,但是我阅读的所有这些解决方案都非常具有破坏性,而且没有一个适用于生产数据库。根据答案的数量,似乎也可能有几个原因造成这个错误。

我的特殊情况

我的错误是由于迁移表中缺少一个条目造成的。我不确定它是如何发生的,但是通过把它加回来,我不再收到错误。

答案很简单:

首先备份文件夹 bootstrap/cache。

然后删除引导/缓存文件夹中的所有文件。

快跑:

php artisan migrate

如果我们必须删除一个未能创建的表,那将非常恼人。因此,我使用 dropIfExists (‘ table _ name’)函数在创建新表之前删除一个表(如果有表)

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


});

对于任何仍在寻找答案的人来说,如果迁移停留在试图运行已经运行的迁移(因此,“表已经存在”问题) ,只需执行以下操作:

  • 打开导致问题的表的 PHP 文件,注释掉“ up ()”函数中的所有代码。
  • 再次运行“ php Artian shift”。导致问题的文件/表将使用其空函数进行处理。

然后迁移将转移到新的等待迁移。 完成后,取消注释之前注释掉的代码行(可选,但建议不要混淆其他开发人员)

我们不要碰存在于迁移文件夹中的旧的迁移文件。您可以从另一个文件夹中提供它。

第一步

migrations文件夹中创建一个名为 custom的新文件夹。

第二步

现在在自定义文件夹中创建迁移文件。

第三步

使用 path参数运行 migrate命令。

php artisan migrate --path=database/migrations/custom

检查 表名

Schema: : create (‘ Table _ name’,function (Blueprint $table))