laravel 8 播种,SQLSTATE[23000]:违反完整性约束:

Posted

技术标签:

【中文标题】laravel 8 播种,SQLSTATE[23000]:违反完整性约束:【英文标题】:laravel 8 seeding , SQLSTATE[23000]: Integrity constraint violation: 【发布时间】:2021-07-10 00:48:00 【问题描述】:

我已将我的项目从 Laravel 7 降级到 8。但问题是,当我运行播种命令 php artisan db:seed 时,它会显示错误 SQLSTATE[23000]:完整性约束违规:。这是因为它播种了我之前运行的先前播种数据。 在运行播种命令之前我也做过

    在 DatabaseSeeder.php 和其他 Seeder 文件的顶部添加 Database\Seeders 命名空间

    将文件夹名称种子替换为位于 \database\ 文件夹的播种机

    如下更新composer.json:

    "autoload": 
    "psr-4": 
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    
    

    ,

    最后,运行下面的命令

    作曲家转储自动加载

    php 工匠数据库:种子

我还更改了 DatabaseSeeder 命令 $this->call(DeliveryAddressTableSeeder::class);

DeliveryAddressTableSeeder

    <?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\DeliveryAddress;

class DeliveryAddressTableSeeder extends Seeder

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    
        //
        $deliveryRecords = [
            ['id' => 1, 'user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
        ];

        DeliveryAddress::insert($deliveryRecords);
    

【问题讨论】:

你能展示你的 DeliveryAddressTableSeeder 播种机吗?该表中有数据吗? @Psycho 请结帐。我已经更新了问题 如果我对播种的理解正确,您只需要在创建表后运行一次,一旦为数据库播种,除非您刷新数据库,否则您不需要再次运行它。 @MuqadarAli,你不想在播种前先截断你的表吗?您的收货地址的 id 设置为 1。我猜这个 ID 在您的表中设置为增量。我认为您应该截断您的表格,或者从播种机中删除“id”字段。 @Muqadar 根据你的播种机,Jaswinder 的回答对你来说应该足够了 【参考方案1】:
        Eloquent::unguard();

        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $this->call('YourTTableSeeder');

        DB::statement('SET FOREIGN_KEY_CHECKS=1;');

把这些扔进你的播种机

【讨论】:

【参考方案2】:

我希望 DeliveryAddress 迁移将包含带有 $table->id(); 的列宣言。在这种情况下,您的播种机在多次运行时会在 id 列中插入重复值。

您可以在运行播种机之前截断表格。

    <?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\DeliveryAddress;

class DeliveryAddressTableSeeder extends Seeder

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    
        DeliveryAddress::truncate();
        //
        $deliveryRecords = [
            ['id' => 1, 'user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
        ];

        DeliveryAddress::insert($deliveryRecords);
    

或者您可以跳过插入 id 列的值,因为它是自动递增值。

 public function run()
  
        
        $deliveryRecords = [
                ['user_id' => 1, 'name' => '***', 'address' => 'Test 123', 'city' => '*******', 'country' => '******', 'pincode' => '*****', 'mobile' => '**********', 'status' => 1], 
            ];
    
        DeliveryAddress::insert($deliveryRecords);
  

另外,确认 user_id 列是否有任何外键约束。如果是,您应该为 id 为“1”的 users 表记录一个记录,以避免任何不良数据。

【讨论】:

以上是关于laravel 8 播种,SQLSTATE[23000]:违反完整性约束:的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的播种表错误?

播种时LARAVEL 5.4 SQL“找不到列”

Laravel 8 Jetstream:无法使用使用工厂和播种机播种的帐户登录

SQLSTATE[HY000] [2002] 连接被拒绝 Laravel 5.8.35

SQLSTATE [23000]:完整性约束违规:1052 列“created_at”在 order 子句中不明确 Laravel 5.5

SQLSTATE [HY000] Laravel 8 中的外键约束格式错误