我试图运行迁移(见下文)并为数据库播种,但是当我运行时
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`
))
我查看了这个错误应该是什么意思,并且还发现examples其他人遇到了同样的问题,甚至只是与使用MySQL及其解决方案有关,但是应用:< / p>
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
在down()中似乎无法正常工作,当我在MySQL中运行describe时,表格看起来是正确的。
正确命名迁移以确保首先迁移users表,然后确定可以应用外键的车辆,并且正确设置的表表明迁移已运行,但随后发生错误。我删除并重新创建了数据库并再次尝试,结果相同。我也不明白为什么它试图截断数据库的第一次迁移和种子,我不会想到当你试图运行php artisan migrate时会发生这种情况:refresh --seed。< / p>
// 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 :(得分:36)
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
它有效!
答案 1 :(得分:27)
如错误所示,您无法截断外键引用的表。删除应该工作...
DB::table('some_table')->delete();
答案 2 :(得分:4)
放下
Schema::disableForeignKeyConstraints();
在关闭运行方法之前
Schema::enableForeignKeyConstraints();
答案 3 :(得分:3)
int* A;
int* B;
int* C;
int set(void)
{
gargv[2] = gargv[3];
// example, if A and 10 given by user then set A = 10 and return
}
int main (int argc, char** argv)
{
gargv = argv;
void* mem_chunk = calloc(5, sizeof(int));
A = &mem_chunk[1];
B = &mem_chunk[2];
C = &mem_chunk[3];
if (strcmp(argv[1], "set") == 0)
{
set();
}
}
clear
table
使用Eloquent
:
Model::query()->delete();
使用默认用户模型的示例
User::query()->delete();
答案 4 :(得分:2)
你可以使用它,它适用于我
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
答案 5 :(得分:1)
我的“角色和权限”设置面临相同的问题,这就是我想要的工作。 Truncate()会将Increment列重置为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);
这将层叠附加到角色表的所有其他子表。在我的情况下 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);
然后在DatabaseSeeder.php文件中;
public function run()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call([
RoleSeeder::class,
]);
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
但是我更喜欢delete()方法,因为我不必禁用/启用外键检查
答案 6 :(得分:0)
这对我每次都有用。
添加外键时,请务必添加cascade
。
语法就像这样
$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade');
确保将id
替换为适用于您的任何字段。
现在,在运行种子之前,请先添加{而不是trucate
DB::statement('DELETE FROM table_name');
它将删除所有数据。 希望这会有所帮助。
答案 7 :(得分:0)
你可以使用
DB::table('your_table_name')->delete();
要清空表格,这不会删除表格结构。但是自动增量ID不会从初始编号开始。
答案 8 :(得分:0)
您可以放下它。
$table->dropForeign('posts_user_id_foreign');
答案 9 :(得分:0)
我正在使用Laravel 7.x,这对我有用。不用说,它仅应在开发中使用。要了解更多信息,请查看here。
DatabaseSeeder.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;');
}
}