关于mysql:Laravel 5.1迁移和种子无法截断外键约束中引用的表

Laravel 5.1 Migration and Seeding Cannot truncate a table referenced in a foreign key constraint

我正在尝试运行迁移(见下文)并为数据库播种,但是当我运行时

1
php artisan migrate --seed

我收到此错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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及其解决方案有关,但是应用:

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

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

正确命名迁移以确保首先迁移users表,然后确定可以应用外键的车辆,并且正确设置的表表明迁移已运行,但随后发生错误。 我删除并重新创建了数据库并再次尝试,结果相同。 我也不明白为什么它试图截断数据库的第一个迁移和种子,我不会想到当你试图运行php artisan migrate:refresh --seed时会发生这种情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 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');
}


1
2
3
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

它的工作原理!


如错误所示,您不能截断外键引用的表。 删除应该工作...

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


使用Eloquentclear a table

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

使用默认用户模型的示例

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

您可以使用

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

要清空表,这不会删除表结构。 但是自动增量ID不会从初始数字开始。


这对我来说每次都有用。
添加外键时,请务必添加cascade
语法是这样的

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

确保将id替换为适用于您的任何字段。

现在在运行种子之前添加此代替trucate

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

它将删除所有数据。
希望这可以帮助。