【问题标题】:Laravel Migration table already exists, but I want to add new not the olderLaravel 迁移表已经存在,但我想添加新的而不是旧的
【发布时间】:2014-11-22 12:30:44
【问题描述】:

我之前创建了 users 表。现在,我创建了一个新的迁移以在我的架构中创建一个新的 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');
    }
}

我怎样才能摆脱这个错误?

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      因此,请不要更改迁移文件的文件名,因为名称必须与上次迁移相同。

      【讨论】:

      【解决方案3】:

      如果我们必须删除一个未能创建的表,这很烦人。所以我做了一个简单的逻辑,在创建新表之前删除一个表

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

      【讨论】:

        【解决方案4】:

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

        use Illuminate\Support\Facades\Schema;
        

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

        Schema::defaultStringLength(191);
        

        然后又是php artisan migrate。问题解决了,所有的表都在数据库中创建了。

        【讨论】:

          【解决方案5】:

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

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

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

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

          php artisan migrate
          

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

          【讨论】:

            【解决方案6】:
            1. phpmyadmin 中手动删除所有表。

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

              a) ->index()(位于 2014_10_12_100000_create_password_resets_table.php 第 17 行)

              b) ->unique()(位于 2014_10_12_000000_create_users_table.php 第 19 行)

            3. 运行php artisan migrate

            4. 完成。

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

            【讨论】:

              【解决方案7】:

              答案很直接:

              首先备份文件夹 bootstrap/cache。

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

              现在运行:

              php artisan migrate 
              

              【讨论】:

                【解决方案8】:

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

                app\Providers\AppServiceProvider.php 文件

                并且在 boot 方法里面设置一个默认的字符串长度:

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

                然后打开

                配置\database.php

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

                把它改成

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

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

                php artisan migrate
                

                【讨论】:

                  【解决方案9】:

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

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

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

                  【讨论】:

                  • 虽然这不是最佳实践,但对于紧急情况,我偶尔会手动创建迁移表中缺少的条目。对于需要将大量条目添加到迁移表中的场景,我为此制作了一个工具:adam-makes-websites.com/discoveries/…
                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

                    php artisan migrate:fresh
                    

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

                    【讨论】:

                    • 为我工作:)
                    【解决方案12】:

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

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

                    【讨论】:

                      【解决方案13】:
                      php artisan migrate:rollback 
                      

                      查看解决方案:Laravel Official Solution

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

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

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

                      php artisan migrate:fresh
                      

                      【讨论】:

                        【解决方案14】:

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

                        【讨论】:

                        • 这个答案应该得到更多的支持。您可能熟悉 migrate:refresh 命令,该命令允许您回滚并重新运行所有迁移。当您需要在开发期间重建数据库时,这会有所帮助。 Laravel 5.5 对此进行了改进,添加了一个名为 migrate:fresh 的新命令。 “refresh”和“fresh”的区别在于,新的fresh命令会跳过所有down方法或通过drop表回滚,然后运行up方法。
                        • 这是不正确的!这将删除架构中的所有表!
                        • @levan 上面说过它会删除所有表。如果可以选择删除所有表,我建议将其作为解决方案。
                        【解决方案15】:

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

                        php artisan migrate
                        

                        【讨论】:

                          【解决方案16】:

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

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

                          【讨论】:

                            【解决方案17】:

                            在 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 中使用出色的数据库连接扩展。
                            【解决方案18】:

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

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

                            在我删除用户表user之前

                            删除表用户后

                            【讨论】:

                              【解决方案19】:

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

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

                              然后运行

                              composer update
                              

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

                              【讨论】:

                                【解决方案20】:
                                1. 删除所有表数据库
                                2. 更新文件夹 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();
                                });
                                

                                【讨论】:

                                  【解决方案21】:

                                  编辑:(对于 laravel)

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

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

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

                                  上一条评论,关于流明

                                  [嗯,派对很晚了(可能和我要找的派对不同)。我敲了敲头,大声尖叫着,灰头骨的恩典刚刚找到了解决办法。]

                                  我正在使用 lumen 开发一个安静的应用程序,但我是新手。这是我第一个使用 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,一切都开始正常了。

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

                                  【讨论】:

                                    【解决方案22】:

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

                                    -或-

                                    在 app/Providers/AppServiceProvider.php 中进入这个页面 并在下面添加代码

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

                                    【讨论】:

                                      【解决方案23】:

                                      将此添加到 AppServiceProvider.php

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

                                      【讨论】:

                                        【解决方案24】:

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

                                        php artisan migrate

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

                                        【讨论】:

                                        • 你确定是 "artsian" 而不是 "artisan"
                                        【解决方案25】:

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

                                        php artisan migrate:refresh
                                        

                                        编辑你的迁移文件

                                        php artisan migrate:rollback
                                        

                                        php artisan migrate又一次^_^

                                        完成你的餐桌!

                                        【讨论】:

                                          【解决方案26】:

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

                                          【讨论】:

                                          • 这不是答案。为什么不使用 cmd 删除表或回滚?
                                          • 因为它在第一次尝试时不适用于某些设备并且告诉我们没有什么可以回滚
                                          【解决方案27】:

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

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

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

                                          【讨论】:

                                          • 也解决了我的问题
                                          【解决方案28】:

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

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

                                          [错误异常] 包括(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
                                          

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

                                          【讨论】:

                                            【解决方案29】:

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

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

                                            更正迁移中的向下方法。

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

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

                                            也尝试阅读此question

                                            【讨论】:

                                              【解决方案30】:

                                              在搞乱外键约束后我遇到了类似的问题。我的一张表(笔记)消失了,而另一张表(任务)即使在 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 的人。 不以任何方式声称这是一个正确的工作流程,但它解决了我的问题,看起来很像上面的问题。

                                              【讨论】:

                                                猜你喜欢
                                                • 2017-08-28
                                                • 2017-07-09
                                                • 2019-12-30
                                                • 2015-11-13
                                                • 2021-07-27
                                                • 1970-01-01
                                                • 2020-03-03
                                                • 1970-01-01
                                                • 2017-12-11
                                                相关资源
                                                最近更新 更多