【问题标题】:How to drop table in Laravel?如何在 Laravel 中删除表格?
【发布时间】:2015-09-22 14:48:12
【问题描述】:

问题是我有这个错误:

[PDO异常]

SQLSTATE[42S01]: 基表或视图已存在:1050 表“歌曲”已存在

这是我的迁移文件:

<?php 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 
class CreateSongsTable extends Migration 
{
    public function up() 
    {
        Schema::create('songs', function (Blueprint $table) 
        {
            $table->increments('id');
            $table->integer('user_id');
            $table->string('title');
            $table->string('slug')->unique();
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }
}

我认为解决方案只是删除表然后再次运行迁移,那么如何使用命令行在 Laravel 5 中删除表?我正在使用 MySQL。

【问题讨论】:

  • 如果您已经从迁移文件创建了表,那么只需回滚迁移,请在 cli php artisan migrate:rollback 中运行此命令
  • 我做到了,但错误仍然存​​在
  • 显示您创建歌曲表的迁移文件
  • 在帖子中添加代码而不是在评论中,如果您喜欢它,没有人会阅读此内容,并且您的文件中没有向下功能,这就是回滚不起作用的原因
  • 编辑帖子并在那里添加代码,我会给出正确的代码

标签: laravel-5


【解决方案1】:

要删除表,您可以使用 Schema::drop 方法:

Schema::drop('users');

// Better
Schema::dropIfExists('users');

【讨论】:

  • 感谢您的正确和简洁的回答,但是,我希望看到删除比“用户”更不重要的表的示例。也许 Schema::drop('widgets');和 Schema::dropIfExists('widgets');会减少一些新手破坏他们的安装的风险吗?
  • 我有一个包含数据的表,但我忘记将 dropIfExists 添加到我的数据透视表中,有没有办法在 down 方法中添加这个 dropIfExists 字段而不会丢失数据? @the-alpha
  • Schema::dropIfExists('users'); 删除了table,因此如果您需要数据,如果不备份您的表,您将无法删除它。 @FaridVatani
【解决方案2】:

要在 laravel 中删除表,请创建第一个迁移

删除表格的步骤

$ php artisan make:migration drop_user_table

将这个添加到你的迁移文件里面的函数Schema::drop('tableName');

public function up() 
{
    Schema::dropIfExists(table('songs'));
    $table->increments('id');
    ...

}

然后运行

$ php artisan migrate

【讨论】:

  • 您建议如何回滚表以重新创建它?
  • Schema::create?
【解决方案3】:

您可以使用 drop 或 dropIfExists 方法:

Schema::drop('users');

Schema::dropIfExists('users');

如果要删除最后迁移的表,也可以回滚

php artisan migrate:rollback

migrate:reset 命令将回滚应用程序的所有迁移:

php artisan migrate:reset

migrate:fresh 命令会从数据库中删除所有表,然后执行 migrate 命令:

php artisan migrate:fresh

php artisan migrate:fresh --seed

【讨论】:

  • 回滚命令应该是php artisan migrate:rollback。
【解决方案4】:

您需要在迁移时使用 down 方法,以便在您运行 php artisan migrate:rollback 时它可以删除您的数据库。

例如

<?php

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

class CreateSongsTable extends Migration 
{ 
    public function up() 
    { 
        Schema::create('songs', function (Blueprint $table) { 
            $table->increments('id'); 
            $table->integer('user_id'); 
            $table->string('title'); 
            $table->string('slug')->unique(); 
            $table->timestamps(); 
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
        }); 
    }

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

【讨论】:

    【解决方案5】:

    删除表并再次运行迁移的简单方法。只需运行工匠命令。

    php artisan migrate:fresh
    

    注意:它将删除所有表并重新运行迁移。

    或者如果你有表的种子然后运行这个命令

    php artisan migrate:fresh --seed
    

    参考:Laravel Documentation

    【讨论】:

      【解决方案6】:

      您可以运行php artisan db:wipe,这样您将强制 laravel 删除所有表,而不管外键约束或类似情况,如果您在迁移时忘记了 down() 方法。

      如果您在迁移时没有 down() 方法,则回滚将不起作用。

      您也可以使用php artisan migrate:fresh 这将强制删除所有表,然后运行所有迁移

      【讨论】:

      • 这正是我所需要的
      【解决方案7】:

      使用以下命令在控制台中创建迁移;-

      php artisan make:migration drop_table_name_table;
      

      然后您需要将该迁移中的 up() 函数编辑为类似;-

      public function up()
      {
          Schema::drop('table_name');
      }
      

      然后运行该迁移以完成任务。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
      • 我对您的帖子进行了一些编辑以修正语法。我意识到英语可能不是你的母语,但是在发帖时尽量避免随意的缩写,比如使用“u”代表“you”,并且将句子的开头大写并使用句号等标点符号。这篇文章的内容是正确的,我会给你一个赞成票,但请记住确保你的语法和英语至少有点正式。 Stack Overflow 有时可能是一个不可锻造的地方,所以请记住这一点。
      【解决方案8】:

      如何删除表和迁移

      
      // delete a migration safely from laravel 
      delete migration from database/migrations/ directory
      
      and also delete an entry from migrations table
      I am using PHPMyAdmin so it was too easy. you can do with command to
      
      
      

      【讨论】:

      • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
      • @JDSavaj 感谢您的建议。我会尽力做到这一点。作为初学者很多复杂性
      • 我不确定我是否完全理解这个答案。但是你猜你的说法是使用 PHPMyAdmin 来删除表?不,这是一个糟糕的建议,会破坏迁移系统,并且不会重复从开发环境迁移到暂存或生产环境。
      【解决方案9】:

      我发现一个很好的简单方法就是使用 phpmyadmin 并手动删除表。当然,如果再次运行迁移时迁移仍然存在,则将再次创建表。

      【讨论】:

      • 这不是您用“在 Laravel 中”表达的问题的解决方案。
      • 我从没见过这么差的分数!
      • @vahid 野蛮!!
      • ??? 你应该得到绿旗,因为你成就了我的一天
      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2017-08-09
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多