2017-04-19 21 views
1

データベースからユーザーを削除しようとするとこのエラーが発生します。削除しようとしているユーザーが私はそれを修正する方法や私が間違っている場所を知らない。わからないことは何も変わりますが、私はlaravel親行を削除または更新できません:外部キー制約が失敗します - MYSQL

Usersテーブルを使用して表を作成しただけで包み

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テーブル内のレコードが関連付けられているため、このエラーが発生します。

  1. が別々delete文で最初の予定表から関連するレコードを削除します:あなたは、2つのオプションがあります。

  2. appointments_user_id_foreign外国キーにon delete cascadeオプションを追加します。このオプションは、ユーザのレコードを削除するときに削除されるユーザのために、appointmentsテーブルから関連するレコードを自動的に削除します。

修正FK文は次のように次のようになります。

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

@Nebsterによって提案された解決策は技術的にはエラーメッセージを削除するだけでなく、appointmentsテーブル内の孤立レコード持つ可能 - 削除さに関連する予定をユーザー。したがって、私の意見では外来キーを削除することは賢明な選択肢ではありません。

+0

on delete cascadeオプションを使用したとうまくいく、ありがとう – TF120

0

予定表での外部キーは、ON DELETE を持っているように思えます。オプションを制限してください。制約を変更するappointments_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として設定できます。しかし、システムにもはや存在しないユーザーの予定を保存することは意味がありません。もう1つのアプローチは、そのユーザーを削除する前に、予定表から対応するすべての参照を削除して、ユーザーテーブルから参照を削除することです。

関連する問題