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 8 Jetstream:无法使用使用工厂和播种机播种的帐户登录
SQLSTATE[HY000] [2002] 连接被拒绝 Laravel 5.8.35
SQLSTATE [23000]:完整性约束违规:1052 列“created_at”在 order 子句中不明确 Laravel 5.5