【问题标题】:Run php artisan db:seed more than one and continue for duplicate keys insert运行 php artisan db:seed more than one 并继续插入重复键
【发布时间】:2018-06-18 12:54:21
【问题描述】:

我创建了一个播种器,用于在数据库中插入默认值。

如果我多次运行此播种机,mysql 会返回重复键错误,

所以我的问题是 处理此错误的最佳方法是什么?以及如何继续运行其他种子?

【问题讨论】:

    标签: php laravel orm eloquent migration


    【解决方案1】:

    您不应该多次运行db:seed 命令。更好的方法是使用以下命令重新创建所有表并为数据播种:

    php artisan migrate:refresh --seed
    

    或者在运行php artisan migrate:refresh 命令后只运行一次db:seed

    https://laravel.com/docs/5.5/migrations#rolling-back-migrations

    【讨论】:

    • 谢谢。如果我创建播种机的迁移状态是错误的方法吗?使用 migrate:refresh 我的数据将会丢失。
    • @raminashrafimanesh 你不应该在本地机器上拥有真实数据。即使你需要它,你也应该播种它。例如,如果出于某种原因不想这样做,只需运行php artisan migrate 命令来创建一个新表。然后只执行一个新的播种器而不是运行db:seed
    • 感谢@alexeyMezenin 的解决方案。
    • 糟糕的解决方案,即使使用--seed 标志,它也会回滚所有数据库迁移。我的本地机器没问题,但生产机器不行:(
    【解决方案2】:

    您仍然可以在播种数据之前使用truncate 方法,这将消除重复键错误,因为表已经为空:

    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\DB;
    
    class EntitiesTableSeeder extends Seeder {
    
        public function run() {
    
            DB::table('table')->truncate();
            //OR
            \App\Model::truncate();
    
            // then insert your data here
    
    }
    

    【讨论】:

    • 只有在表的列都不是外键的一部分时才允许截断:`语法错误或访问冲突:1701 无法截断外键约束中引用的表`
    【解决方案3】:

    将你的种子分成更多的文件,然后在database/DatabaseSeeder.php 中这样称呼它们:

    $this->call(AuthorSeeder::class);
    $this->call(ContentSeeder::class);
    

    但可以肯定的是,您不能复制密钥,这是您必须解决的问题。

    【讨论】:

      【解决方案4】:

      eighty8/laravel-seeder

      这个包解决了这个问题,它的版本控制种子就像 laravel 做迁移一样,还有一些其他的好处

      • 允许您在不同的环境中使用不同的值为数据库播种。
      • 允许您以与 Laravel 当前处理相同的方式“版本”种子
      • 迁移。运行 php artisan seed 只会运行尚未运行的种子。
      • 允许您运行同一模型/表的多个种子
      • 在您的数据库处于生产状态时提示您

      【讨论】:

        猜你喜欢
        • 2020-07-13
        • 1970-01-01
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        相关资源
        最近更新 更多