1. ホーム
  2. mysql

[解決済み] 親の行を削除または更新できない: 外部キー制約に失敗 - MYSQL

2022-02-09 03:20:41

質問

データベースからユーザーを削除しようとすると、このエラーが表示されます。削除しようとしているユーザーがappointmentsテーブルの外部キーであるため、このような状態になることはわかっていますが、修正方法やどこで間違ってしまったのかわかりません。このような場合、どのように修正すればよいのでしょうか?

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

解決方法は?

このエラーが発生するのは、削除したいユーザーの関連レコードが appointments テーブルを使用します。2つのオプションがあります。

  1. 最初にappointmentsテーブルから関連するレコードを削除するために、別の delete ステートメントを使用します。

  2. 追加 削除カスケードで オプションに appointments_user_id_foreign の外部キーです。このオプションは、関連するレコードを自動的に appointments テーブルで、そのユーザーのレコードを削除するときに、削除されます。

修正したfk文は次のようになります。

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

Nebster が提案した方法は、技術的にはエラーメッセージを除去するものですが、オーファン・レコードを appointments テーブル - 削除されたユーザーに関連する予定です。したがって、外部キーを削除することは、私の意見では賢明なオプションではありません。