ChatGPT解决这个技术问题 Extra ChatGPT

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

我怎样才能摆脱错误?


C
Chuck Le Butt

在 v5.x 中,您可能仍然会遇到问题。因此,尝试首先使用手动删除相关表

php artisan tinker

然后

Schema::drop('books')

(并使用 q 退出)

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

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


这帮帮我!运行用户表迁移时出现错误-“指定的密钥太长;最大密钥长度为 767 字节”但我忽略了它并继续。
为我工作。非常感谢。
这对我来说绝对适用于 v5.4。 @Fawel 这是一个完全不同的问题。这是您需要修复该 Laravel 5.4: Specified key was too long error 的链接。
@UsamaMunir 很高兴听到这个消息。您始终可以使用 phpmyadmin 或 table plus 在那里转储迁移表。或者在您的 IDE 中使用出色的数据库连接扩展。
e
eatingthenight

你需要跑

php artisan migrate:rollback

如果这也失败了,只需进入并删除您可能必须做的所有表,因为您的迁移表似乎被搞砸了,或者当您运行先前的回滚时您的用户表没有删除该表。

编辑:

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


是的,谢谢。但我想知道为什么它搞砸了?
好吧,把它放在你的问题中,然后你问如何摆脱它,我回答了这个问题。对不起,我无法读懂你的想法。
对不起,你想的评论。我已经按照你说的做了。有用。我以为它会起作用。但是,你能告诉我这个错误背后的原因吗?谢谢 :)
@MD.AtiqurRahman 搞砸的原因——如果我猜对了——是因为你已经创建了两次迁移。
对我来说说'php artisan migrate:rollback'
A
Abaza

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


天啊 !那是很久以前的事了!
情况并非总是如此,因为当我使用它时,laravel 总是会在你乱用它们时导致迁移失败,导致它进行更改或回滚更改而不更新数据库。
同意@mschuett——我只是按照 Laravel 5.2 'quickstart' 的说明得到了这样的错误。我什至把所有东西都清理干净了,开始了一个全新的项目,然后又发生了。
谢谢,你节省了我很多时间。在我检查我的数据库后,突然我的 migrate 是空的,但仍然只有表存在。所以我需要手动删除它。谢谢
@Abaza thx 我遇到了同样的问题,确实我更改了表的名称,并且还在文件名上编辑了它,但没有在迁移稳定中进行编辑。
v
vinkomlacic

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


这个答案应该得到更多的支持。您可能熟悉 migrate:refresh 命令,该命令允许您回滚并重新运行所有迁移。当您需要在开发期间重建数据库时,这会有所帮助。 Laravel 5.5 对此进行了改进,添加了一个名为 migrate:fresh 的新命令。 “refresh”和“fresh”的区别在于,新的fresh命令会跳过所有的down方法或通过删除表来回滚,然后运行up方法。
这是不正确的!这将删除架构中的所有表!
@levan 上面说过它会删除所有表。如果可以选择删除所有表,我建议将其作为解决方案。
就我而言,它不起作用,因为我有 2 个数据库,由于某种原因,它会抛出错误 Base table or view already exists: 1050 Table 'users' already exists 。似乎第二个数据库没有被重置。
谢谢这个解决方案适用于heroku
T
Trikly

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


或试试这个:Schema::dropIfExists('books');
m
maksbd19

编辑:(对于 laravel)

刚刚在 laravel 中进行项目时遇到了这个问题。我的表搞砸了,需要经常更改列。一旦表格在那里,我就无法再运行 php artisan migrate 了。

我已完成以下操作以解决此问题-

删除数据库中的表【每一张,包括迁移表】 $ composer dump-autoload -o php artisan migrate

上一条评论,关于流明

[嗯,派对很晚了(可能和我要找的派对不同)。我撞到头,大声尖叫,在灰色骷髅的恩典下找到了解决办法。]

我正在使用流明开发一个宁静的应用程序,我是新手。这是我第一个使用 laraval 和 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 和 postman 更改标题)。我按预期收到了带有数据的 JSON 响应。

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

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

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

我正在记录我的经验以供将来参考,并希望这可能对将来的某人有所帮助。


N
Nik K

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

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

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


也解决了我的问题
M
Murad

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

php artisan migrate:fresh

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


为我工作:)
M
Martijn van der Bruggen

在搞乱外键约束后我遇到了类似的问题。我的一张表(笔记)消失了,而一张表(任务)即使在 MySQL 中删除后也不断返回(任务),阻止我运行:php artisan migrate/refresh/reset,这产生了上述 42s01 异常。

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

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


g
goto

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

https://i.stack.imgur.com/xchYR.png

php artisan migrate:refresh

编辑您的迁移文件

php artisan migrate:rollback

再次php artisan migrate ^_^

做你的桌子!


V
Vim Diesel

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

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

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


尽管这不是最佳实践,但对于紧急情况,我偶尔会手动创建迁移表中缺少的条目。对于需要将大量条目添加到迁移表中的场景,我为此制作了一个工具:adam-makes-websites.com/discoveries/…
A
Aydın Bulut

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

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

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

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

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

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

为了解决这个问题,我从不记得的地方找到了下面的 composer 命令。

composer dump-autoload

当我运行此代码时,与我删除的迁移文件相关的行消失了。然后我跑了:

php artisan make:migration create_articles_table --create=articles

最后我重新创建了同名的迁移文件


S
Silvanas

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


那不是答案。为什么不使用 cmd 删除表或回滚?
因为它在第一次尝试时不适用于某些设备并且告诉我们没有什么可以回滚
C
Cengkuru Michael

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

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

f
flik
php artisan migrate:rollback 

检查解决方案:Laravel Official Solution

如迁移 guide 中所述,要解决此问题,您只需编辑 app\Providers\AppServiceProvider.php 文件并在引导方法中设置默认字符串长度:

use Illuminate\Support\Facades\Schema;

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

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

php artisan migrate:fresh

J
James

对于仍在寻找答案的任何人,如果迁移卡在尝试运行已运行的迁移之一(因此,“表已存在”问题),只需执行以下操作:

打开导致问题的表的 PHP 文件并注释掉“up()”函数中的所有代码。

再次运行“php artisan migrate”。导致问题的文件/表将使用它的空函数进行处理。

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


C
Community

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

如果出现问题,请从 phpmyadmin 之类的数据库应用程序中手动删除表(我正在使用 sequel pro for mac)。

更正迁移中的 down 方法。

注意:先回滚然后迁移。不要使用 migrate:refresh 来注意错误出现在哪里。

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

也尝试阅读此question


n
ntsasng

将此添加到 AppServiceProvider.php

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

J
Jacksonit.org

删除所有表数据库 更新文件夹 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();
});

A
Andrew Lohr

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

这是之前和之后的屏幕截图

在我删除用户表用户之前

https://i.stack.imgur.com/O0YLa.png

https://i.stack.imgur.com/z6PmY.png


U
Udhav Sarvaiya

在 phpmyadmin 中手动删除所有表。转到数据库/迁移中的每个迁移文件。查找并删除这 2 个代码:a) ->index()(在 2014_10_12_100000_create_password_resets_table.php 第 17 行找到) b) ->unique()(在 2014_10_12_000000_create_users_table.php 在第 19 行找到)运行 php artisan migrate Done。

我认为这是因为最新的 laravel 课程(2018 年 2 月 12 日)已经删除了 ->index()->unique() 的功能


R
Riki krismawan

如果我们必须删除一个未能创建的表,这很烦人。所以我在创建新表之前使用 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();

});

S
Stubbies

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

php artisan migrate

全部设置。我认为这个答案有帮助。


你确定它是“工匠”而不是“工匠”吗?
S
Sameera Liyanage

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

-或者-

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

use Illuminate\Support\Facades\Schema;

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

F
Francesco Boi

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

通过给 Schema 一个长度,似乎是 providers 目录的 AppServiceProvider.php 文件。在这种情况下 191。像魔术一样工作。Screenshot。然后他跑了:php artisan migrate:fresh。希望这有效。


M
Masoud Rezaei

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


M
Mehemmed

解决方法:Laravel 迁移表已经存在... ||它也适用于 Laravel 5.8

app\Providers\AppServiceProvider.php 文件

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

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

并打开

配置\数据库.php

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

并将其更改为

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

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

php artisan migrate

R
Risheekant Vishwakarma

答案很简单:

首先备份文件夹 bootstrap/cache。

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

现在运行:

php artisan migrate 

U
Udhav Sarvaiya

从字面上看,创建数据库需要几秒钟。

导出您当前的数据库以防它包含敏感数据。

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

删除数据库并重新创建数据库。

php artisan migrate

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


U
Udhav Sarvaiya

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

use Illuminate\Support\Facades\Schema;

并增加 boot 方法中的默认字符串长度以添加:

Schema::defaultStringLength(191);

然后再次php artisan migrate。问题已解决,所有表都在数据库中创建。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅