无法删除或更新父行:外键约束失败 - MYSQL

TF1*_*120 6 mysql

我在尝试从数据库中删除用户时遇到此错误,我知道这样做是因为我尝试删除的用户是约会表中的外键,但我不知道如何更正或哪里出错了 不确定它是否会改变,只是因为我使用laravel创建表

用户表

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `firstname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `surname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `address` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `postcode` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `dateofbirth` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `role` tinyint(4) NOT NULL,
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

约会表

 CREATE TABLE `appointments` (
      `id` int(10) UNSIGNED NOT NULL,
      `time` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
      `date` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      `doctor_id` int(10) UNSIGNED NOT NULL,
      `user_id` int(10) UNSIGNED NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    ALTER TABLE `appointments`
      ADD PRIMARY KEY (`id`),
      ADD KEY `appointments_doctor_id_foreign` (`doctor_id`),
      ADD KEY `appointments_user_id_foreign` (`user_id`);

    ALTER TABLE `appointments`
      ADD CONSTRAINT `appointments_doctor_id_foreign` FOREIGN KEY (`doctor_id`) REFERENCES `doctors` (`id`),
      ADD CONSTRAINT `appointments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);
Run Code Online (Sandbox Code Playgroud)

Sha*_*dow 16

您收到此错误,因为您要删除的用户在appointments表中具有关联的记录.你有2个选择:

  1. 首先使用单独的delete语句从约会表中删除关联的记录.

  2. 删除级联选项添加到appointments_user_id_foreign外键.删除appointments用户记录时,此选项将自动从表中删除任何相关记录,以便删除用户.

修改后的fk语句如下所示:

... ADD CONSTRAINT `appointments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

@Nebster提出的解决方案在技术上删除了错误消息,但也允许在appointments表中包含孤立记录- 与已删除用户相关的约会.因此,在我看来,删除外键不是一个明智的选择.


小智 6

SET FOREIGN_KEY_CHECKS=0; –禁用它们

SET FOREIGN_KEY_CHECKS=1; –重新启用它们

  • 我认为外键检查不应被忽略,我建议向模型属性添加适当的约束,例如 on_update=models.CASCADE 或数据库中提到的任何一个。 (2认同)