2017-04-19 224 views
1

我试图从数据库中删除用户时出现此错误,我知道这是因为我试图删除的用户是外键在约会表中,但我不知道如何纠正它或我出错的地方。不知道这是否改变什么,但只是柜面我使用laravel无法删除或更新父行:外键约束失败 - MYSQL

用户表

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; 

预约表

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`); 

回答

3

你得到这个错误,因为你想删除的用户已appointments表中的相关记录。您有2个选项:

  1. 从单独的delete声明中首先删除约会表中的关联记录。

  2. on delete cascade选项改为appointments_user_id_foreign外键。此选项将自动删除appointments表中的所有关联记录,以便在删除用户记录时删除用户。

修改后的FK语句看起来象如下:

... ADD CONSTRAINT `appointments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; 

通过@Nebster提出的解决方案在技术上消除了错误信息,而且还可以使appointments表中有孤立记录 - 有关删除的约会用户。因此,在我看来,移除外键不是一个明智的选择。

+0

与删除级联选项,它工作很好,谢谢 – TF120

0

好像在约会表的外键上的删除创建的表:限制选项。更改约束appointmentments_user_id_foreign删除:级联,您应该可以在保留外键的同时删除用户。

ALTER TABLE "appointments" DROP FOREIGN KEY "appointments_user_id_foreign"; 

ALTER TABLE "appointments" ADD CONSTRAINT "appointments_user_id_foreign" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE; 
+0

外键约束用于确保只有现有用户可以有约会。 – Shadow

0

您不能简单地从表格用户中删除用户。它被约会表引用为外键索引。我认为这是公平的,当一个用户被删除时,他的所有引用都应该从其他表中删除。

对于您的情况,您可以改进数据库设计。您可以使约会表中的外键列成为可选。所以如果删除用户,相应记录的user_id可以设置为NULL。但是为那些不再存在于系统中的用户存储约会是没有意义的。另一种方法是在删除该用户之前,从约会表中删除所有相应的引用,然后从用户表中删除引用表

相关问题