当我播种数据时,表中存在外键然后发生以下错误..我无法解决这个问题,我怎么解决?
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update
a child row: a foreign key constraint fails (`doctodoor2014`.`staffs`,
CONSTRAINT `staffs_specialty_id_foreign` FOREIGN KEY (`specialty_id`) REFERENCES
specialties` (`id`)) (SQL: insert into `staffs` (`id`, `first_name`, `last_name`)
values (1, Admin, Admin))
我可以用外键播种表吗?
答案 0 :(得分:0)
是的,您可以使用外键播种。您只需要在插入子项之前确保父项存在。 查看有问题的两个表的内容,看看您尝试插入的给定子ID是否存在父ID。
我发现我的问题是我每次运行种子类时,父表的id会增加。因为我的子表插入具有硬编码的id,所以我会得到参照完整性错误。
作为一种快速解决方法,您可以删除数据库并重新创建它,这将重置所有自动增量ID。
当然,最好修复种子定义。我通过将子表中的硬编码ID替换为实际的父ID来执行此操作,如下所示:
//,'user_id'=>1
,'user_id'=>User::first()->id
为了帮助调试 - 在每个种子类的开头和结尾添加echo语句,以帮助查看错误的位置。
public function run() {
echo PHP_EOL.'QuestionTableSeeder BEGIN'.PHP_EOL;
$test_id = Test::first()->id;
echo PHP_EOL."test_id:'" . $test_id. "'";
...
echo PHP_EOL.'QuestionTableSeeder END'.PHP_EOL;
}
让我感到震惊的另一件事是我在打电话:
User::first()->id
返回一个空字符串。 事实证明,它实际上意味着:
User::first()->user_id
该表是由另一位开发人员创建的,他没有遵循将主键命名为id!
的惯例