mtp*_*ltz 19 mysql laravel laravel-5 laravel-seeding laravel-migrations
我正在尝试运行迁移(见下文)并为数据库播种,但是当我运行时
php artisan migrate --seed
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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`
))
Run Code Online (Sandbox Code Playgroud)
我查看了这个错误应该是什么意思,并且还找到了遇到同样问题的其他人的例子,甚至只是与使用MySQL及其解决方案有关,但是应用:
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Run Code Online (Sandbox Code Playgroud)
在down()中似乎不起作用,当我在MySQL中运行describe时,表格看起来是正确的.
正确命名迁移以确保首先迁移users表,然后确定可以应用外键的车辆,并且正确设置的表表明迁移已运行,但随后发生错误.我删除并重新创建了数据库并再次尝试,结果相同.我也不明白为什么它试图截断数据库的第一个迁移和种子,我不会想到当你试图运行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');
}
Run Code Online (Sandbox Code Playgroud)
小智 41
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Run Code Online (Sandbox Code Playgroud)
这是工作!
use*_*496 28
如错误所示,您不能截断外键引用的表.删除应该工作...
DB::table('some_table')->delete();
Run Code Online (Sandbox Code Playgroud)
小智 7
下降前
Schema::disableForeignKeyConstraints();
Run Code Online (Sandbox Code Playgroud)
在关闭运行方法之前
Schema::enableForeignKeyConstraints();
Run Code Online (Sandbox Code Playgroud)
要clear一个table使用Eloquent:
Model::query()->delete();
Run Code Online (Sandbox Code Playgroud)
使用默认用户模型的示例
User::query()->delete();
Run Code Online (Sandbox Code Playgroud)
我的角色和权限设置也遇到了同样的问题,这就是我所做的,它按我想要的方式工作。Truncate() 会将增量列重置为 1,但会抛出外键错误,而另一方面,delete 工作正常,但不会重置增量列,因此我在 Seeder 的文件中执行了以下操作(在我的情况下为 RoleSeeder.php) )
1. [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);
Run Code Online (Sandbox Code Playgroud)
这将级联附加到角色表的所有其他子表。就我而言,users_roles表。这样我就避免了禁用和启用外键检查。
2. 需要记住的事情/第二种方法 [ truncate() 方法 ]
如果您不想删除子表中存储的所有数据(在我的例子中是 users_roles 表)...您可以使用 truncate() ,然后在 DatabaseSeeders.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);
Run Code Online (Sandbox Code Playgroud)
然后在 DatabaseSeeder.php 文件中执行以下操作:
public function run()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call([
RoleSeeder::class,
]);
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
Run Code Online (Sandbox Code Playgroud)
但我更喜欢 delete() 方法,因为我不必禁用/启用外键检查
| 归档时间: |
|
| 查看次数: |
19379 次 |
| 最近记录: |