programing

Larvel 5.1 마이그레이션 및 시드 외부 키 제약 조건에서 참조되는 테이블을 자를 수 없음

javajsp 2023. 8. 27. 08:56

Larvel 5.1 마이그레이션 및 시드 외부 키 제약 조건에서 참조되는 테이블을 자를 수 없음

마이그레이션을 실행하고(아래 참조) 데이터베이스를 시드하려고 하는데 실행할 때

php artisan migrate --seed

다음 오류가 발생했습니다.

Migration table created successfully.
Migrated: 2015_06_17_100000_create_users_table
Migrated: 2015_06_17_200000_create_password_resets_table
Migrated: 2015_06_17_300000_create_vehicles_table

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
)) (SQL: truncate `users`)

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
))

저는 이 오류가 무엇을 의미하는지 찾아봤고, MySQL과 그 솔루션을 사용하는 것과 관련된 다른 사람들의 예도 발견했지만, 다음을 적용했습니다.

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

아래()는 작동하지 않는 것 같고 MySQL에서 설명을 실행하면 테이블이 올바르게 보입니다.

마이그레이션 이름이 올바르게 지정되어 사용자 테이블이 먼저 마이그레이션된 다음 외부 키를 적용할 수 있도록 차량이 마이그레이션되고 테이블이 올바르게 설정되면 마이그레이션이 실행된 것으로 나타나지만 오류가 발생합니다.DB를 떨어뜨렸다가 다시 만들고 다시 해보니 결과가 같습니다.저는 또한 왜 그것이 데이터베이스의 첫 번째 마이그레이션과 시드에서 자르기를 시도하는지 이해할 수 없습니다. 저는 당신이 phpartisan migrate:refresh --seed를 실행하려고 할 때 그런 일이 발생할 것이라고 생각하지 않았을 것입니다.

// 2015_06_17_100000_create_users_table.php

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('username', 60)->unique();
            $table->string('email', 200)->unique();
            $table->string('password', 255);
            $table->string('role')->default('user');
            $table->rememberToken();
            $table->timestamps();
        });
    }
}

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

// 2015_06_17_300000_create_vehicles_table.php

class CreateVehiclesTable extends Migration
{
    public function up()
    {
        Schema::create('vehicles', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->string('make');
            $table->string('model');
            $table->string('year');
            $table->string('color');
            $table->string('plate');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
        });
    }
}

public function down()
{
    Schema::drop('vehicles');
}
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

효과가 있습니다.

오류에서 알 수 있듯이 외부 키에서 참조하는 테이블은 잘라낼 수 없습니다.그래도 삭제는 가능해야 합니다.

DB::table('some_table')->delete();

낙하 전에

Schema::disableForeignKeyConstraints();

및 클로즈 런 전 방법

Schema::enableForeignKeyConstraints();

로.clear a table사용.Eloquent:

Model::query()->delete();

기본 사용자 모델 사용 예제

User::query()->delete();

역할 및 권한 설정에서 동일한 문제가 발생했습니다. 이것이 제가 원하는 대로 작동한 작업입니다.잘라내기()는 증분 열을 1로 재설정하지만 외부 키 오류를 던집니다. 반면에 삭제는 정상적으로 작동하지만 증분 열은 재설정하지 않습니다. 그래서 저는 Seeder의 파일(즉, RoleSeeder)에서 다음을 수행했습니다.내 경우에는 php)

[ delete(삭제) 방법 ]

$roles = [];

... // Some foreach statement to prepare an array of data for DB insert()

// Delete and Reset Table
DB::table('roles')->delete();
DB::statement("ALTER TABLE `roles` AUTO_INCREMENT = 1");
// Insert into table
DB::table('roles')->insert($roles);

이렇게 하면 역할 테이블에 첨부된 다른 모든 하위 테이블이 계단식으로 처리됩니다.내 경우 users_dll 테이블.이렇게 하면 외부 키 검사를 비활성화하거나 활성화하지 않아도 됩니다.

염두에 두어야 할 사항 / 두 번째 접근법 [자르기() 방법 ]

자식 테이블(나의 경우 users_download 테이블)에 저장된 모든 데이터를 삭제할 의도가 없다면...자르기()로 이동한 다음 데이터베이스에서 이동할 수 있습니다.Seeders.php 파일을 사용하지 않도록 설정하고 외부 키 검사를 사용하도록 설정합니다.이를 테스트한 결과 users_roles 데이터는 손상되지 않았습니다. 영향을 받은 역할 표의 시드가 표시되었습니다.

//RoleSeeders.php File

$roles = [];

... // Some foreach statement to prepare an array of data for DB insert()

// Truncate Table
DB::table('roles')->truncate();
// Insert into table
DB::table('roles')->insert($roles);

그런 다음 데이터베이스에서씨더.당신은 php 파일을 가지고 있습니다;

public function run()
{
    DB::statement('SET FOREIGN_KEY_CHECKS=0;');

    $this->call([
        RoleSeeder::class,
    ]);

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

그러나 외부 키 검사를 비활성화/활성화할 필요가 없기 때문에 delete() 방법을 선호합니다.

사용할 수 있습니다.

DB::table('your_table_name')->delete();

테이블을 비우려면 테이블 구조가 삭제되지 않습니다.그러나 자동 증분 ID는 초기 번호부터 시작되지 않습니다.

이것이 매번 저에게 도움이 되는 것입니다.키를 외부키추때추합야니다해가가할를,합을 추가해야 .cascade과 같습니다.

$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade');

교체해야 합니다.id당신에게 적용 가능한 분야로.

씨뿌리기를 대신 하세요.trucate

DB::statement('DELETE FROM table_name');

모든 데이터가 삭제됩니다.이게 도움이 되길 바랍니다.

그냥 버려도 돼요.

$table->dropForeign('posts_user_id_foreign');

저는 Laravel 7.x를 사용하고 있습니다. 이것은 저에게 효과가 있었습니다.개발에만 사용되어야 함은 말할 필요도 없습니다.자세한 내용은 여기를 참조하십시오.

데이터베이스씨더.php

    <?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // the Eloquent part and disabling and enabling of foreign keys is only intended for development
        Eloquent::unguard();

        //disable foreign key check for this connection before running seeders
        DB::statement('SET FOREIGN_KEY_CHECKS=0;');

        $this->call(RolesTableSeeder::class);
        $this->call(UsersTableSeeder::class);

        // supposed to only apply to a single connection and reset it's self
        // but I like to explicitly undo what I've done for clarity
        DB::statement('SET FOREIGN_KEY_CHECKS=1;');
    }
}

언급URL : https://stackoverflow.com/questions/31192207/laravel-5-1-migration-and-seeding-cannot-truncate-a-table-referenced-in-a-foreig