Laravel 5.1 迁移和填充 无法截断被外键约束引用的表

8 浏览
0 Comments

Laravel 5.1 迁移和填充 无法截断被外键约束引用的表

我尝试运行迁移(见下文)并填充数据库,但当我运行

php artisan migrate --seed

时,我收到以下错误:

迁移表成功创建。
迁移:2015_06_17_100000_create_users_table
迁移:2015_06_17_200000_create_password_resets_table
迁移:2015_06_17_300000_create_vehicles_table
[Illuminate\Database\QueryException]
SQLSTATE[42000]:语法错误或访问冲突:1701 无法截断在外键约束中引用的表(`app`。`vehicles`,约束`vehic
les_user_id_foreign` FOREIGN KEY(`user_id`)REFERENCES `app`。`users`(`id`
))(SQL:截断`users`)
[PDOException]
SQLSTATE[42000]:语法错误或访问冲突:1701 无法截断在外键约束中引用的表(`app`。`vehicles`,约束`vehic
les_user_id_foreign` FOREIGN KEY(`user_id`)REFERENCES `app`。`users`(`id`
))

我查找了一下这个错误的含义,并找到了其他人遇到相同问题的示例,甚至只是与使用MySQL有关,以及他们的解决方案,但应用:

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

在down()方法中似乎不起作用,当我在MySQL中运行describe时,表看起来是正确的。

迁移的命名正确,以确保首先迁移用户表,然后是车辆表,以便应用外键,并且正确设置表表明迁移已运行,但然后出现错误。我删除并重新创建了数据库,再次尝试,结果是一样的。我也不明白为什么在第一次迁移和填充数据库时它会尝试截断,我原本认为在运行php artisan 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');

}

0
0 Comments

在Laravel 5.1中,当使用Migration和Seeding时,可能会遇到一个问题:无法截断(truncate)一个被外键约束引用的表。下面是出现该问题的原因和解决方法。

问题原因:

在Laravel 5.1中,使用Migration和Seeding时,如果尝试截断一个被外键约束引用的表,会报错。这是因为截断操作会重置自增的ID,从而使得与该表相关的关联关系出错。

解决方法:

虽然跳过外键检查是一个非常不好的做法,但在一个全新的项目中,这可能在创建Migration和Seeding时有所帮助。下面是解决该问题的方法:

1. 在执行截断操作之前,使用以下代码禁用外键检查:

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

2. 执行截断操作,例如截断User表:

App\User::truncate();

3. 在执行其他操作之前,使用以下代码启用外键检查:

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

通过以上步骤,可以成功截断被外键约束引用的表。但需要注意的是,这种做法在实际数据中是不推荐的,因为截断操作会破坏与该表相关的关联关系。

作者认为,在一个全新的项目中,使用这种方法可能有所帮助。但如果在一个大型且多表关联的环境中出现了孤立的数据,如何修复这些数据,又保持完整的约束限制呢?

以上就是关于Laravel 5.1 Migration和Seeding无法截断被外键约束引用的表的问题及解决方法的内容。

0
0 Comments

在Laravel 5.1中,当我们尝试使用迁移(Migration)和填充(Seeding)功能时,可能会遇到一个错误,错误信息为“Cannot truncate a table referenced in a foreign key constraint”(无法截断被外键约束引用的表)。这个问题的出现原因是我们无法截断(truncate)被外键约束引用的表,但是删除(delete)操作是可以正常工作的。

解决这个问题的方法是使用删除操作代替截断操作。我们可以使用Laravel中的DB类来执行删除操作。以下是解决方法的示例代码:

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

通过使用上述代码,我们可以成功删除被外键约束引用的表。这样我们就可以顺利执行迁移和填充操作,而不会遇到“Cannot truncate a table referenced in a foreign key constraint”错误。

0
0 Comments

在Laravel 5.1中进行迁移和填充时,可能会遇到一个错误,错误信息为"Laravel 5.1 Migration and Seeding Cannot truncate a table referenced in a foreign key constraint"。这个错误的出现是因为在迁移和填充过程中,尝试清空一个存在外键约束的表时出现了问题。

解决这个问题的方法很简单,只需要在删除表之前和完成迁移或填充之前加入一段代码即可。在删除表之前,我们需要禁用外键约束,这样就可以成功清空表。而在完成迁移或填充之前,我们需要重新启用外键约束,以确保数据库的完整性。

下面是解决这个问题的代码示例:

before drop 
[apcode]
Schema::disableForeignKeyConstraints();

[/apcode]

and before close run method
[apcode]
Schema::enableForeignKeyConstraints();

[/apcode]

通过在删除表之前使用`Schema::disableForeignKeyConstraints()`方法禁用外键约束,在完成迁移或填充之前使用`Schema::enableForeignKeyConstraints()`方法重新启用外键约束,我们就可以成功解决"Laravel 5.1 Migration and Seeding Cannot truncate a table referenced in a foreign key constraint"的问题。

希望这篇文章对你有所帮助!

0