简体   繁体   中英

Laravel Seeding error SQLSTATE[23000]

When I'm trying to seed my database, but I get an error saying that I have a duplicate entry '1' for the key 'users_class_id_unique.

Does anyone know what is causing this problem?

This is what the error looks like

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' 
for key 'users_class_id_unique' (SQL: insert into `users` (`name`, 
`lastname`, `email`, `class_id`, `password`
`role_id`, `created_at`, `updated_at`) values (Example, Name, 
example@outlook.com, 1, 
$2y$10$gqFXkYt9LRoCH6LqsosEPOI/2t.VDoNzBgV3x/przh.1KiuJqvRwe, 2, 1971-06-20 
06:10:44, 1975-03-0
9 17:46:23))



[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' 
for key 'users_class_id_unique'

This is my seeder file

<?php

use Faker\Factory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(1,7) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => rand(1, 3),
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}
}

Class MODEL

namespace App;

use Illuminate\Database\Eloquent\Model;

class Classes extends Model
{
protected $fillable = [
    'class_name', 'subject_id',
];

public function subjects() {
    return $this->hasMany('App\Subject');
}

public function users() {
    return $this->hasMany('App\User');
}


}

CLASS Migration

<?php

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

class CreateClassesTable extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('classes', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('subject_id');
        $table->string('class_name')->unique();
        $table->rememberToken();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
}
}

Actually you can not insert 'class_id' => 1 for both users . This class id should be unique . And it's defined in your model file . If you want to insert same 'class_id' then change your model and db OR other-wise change your 'class_id' one of them . Such as: 'class_id' => 1, 'class_id' => 2,

<?php

use Faker\Factory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 2,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 3,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(4,10) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => rand(1, 3),
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}
}

The problem lays inside your migration. Your column class_id is set to unique but you keep assigning the same value 'class_id' => 1 . Change it to

public function up()
{
    Schema::create('classes', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('subject_id');
        $table->string('class_name');
        $table->rememberToken();
        $table->timestamps();
    });
}

and re-run the migrations. Also make sure that it gets changed in the users table.

php artisan migrate:refresh --seed

You will have to figure out yourself whether you need the column to be unique or not. If it has to be unique, you will have to change the seeder to make sure it only seeds unique values for class_id .

If you cannot re-run the migrations, change the seeder like this:

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 2,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 3,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(4,10) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => $index,
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}

In case your class_id needs to be either 1, 2 or 3, then use your seeder.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM