Tidak dapat menghapus atau memperbarui baris induk: kendala kunci asing gagal - MYSQL

Saya mendapatkan kesalahan ini ketika mencoba menghapus pengguna dari database, saya tahu itu' melakukan ini karena pengguna yang saya coba hapus adalah kunci asing di tabel janji temu, tapi saya tidak tahu bagaimana cara memperbaikinya atau di mana saya salah. Tidak yakin apakah itu mengubah apa pun tetapi kalau-kalau saya membuat tabel menggunakan laravel

Tabel pengguna

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;

Tabel janji temu

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

Anda mendapatkan error ini karena pengguna yang ingin Anda hapus memiliki record terkait dalam tabel appointments. Anda memiliki 2 opsi:

  1. Hapus catatan terkait dari tabel appointment terlebih dahulu dengan pernyataan delete yang terpisah.

  2. Tambahkan opsi on delete cascade ke foreign key appointments_user_id_foreign. Opsi ini akan secara otomatis menghapus catatan terkait dari tabel appointments untuk pengguna yang akan dihapus ketika Anda menghapus catatan pengguna.

Pernyataan fk yang dimodifikasi terlihat seperti berikut:

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

Solusi yang diusulkan oleh @Nebster secara teknis menghilangkan pesan kesalahan, tetapi juga memungkinkan memiliki catatan yatim piatu dalam tabel appointments - janji temu yang terkait dengan pengguna yang dihapus. Oleh karena itu, menghapus kunci asing bukanlah pilihan yang masuk akal menurut saya.

Komentar (0)

Sepertinya kunci Asing Anda di tabel Appointments memiliki On delete: Batasi opsi. Ubah Constraint appointments_user_id_foreign menjadi On delete: Cascade dan Anda seharusnya dapat menghapus Pengguna sambil mempertahankan kunci Asing.

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;
Komentar (1)

Anda tidak bisa begitu saja menghapus pengguna dari tabel users. Ini sedang direferensikan oleh tabel janji temu sebagai indeks kunci asing. Saya pikir cukup adil bahwa ketika seorang pengguna dihapus semua referensinya harus dihapus dari tabel lain.

Untuk skenario Anda, Anda dapat memperbaiki desain database Anda. Anda dapat membuat kolom foreign key di tabel appointment menjadi opsional. Jadi, jika pengguna dihapus, user_id record yang sesuai dapat ditetapkan sebagai NULL. Tetapi tidak ada artinya menyimpan janji temu untuk pengguna yang sudah tidak ada lagi di sistem. Pendekatan lain adalah sebelum menghapus pengguna itu, hapus semua referensi terkait dari tabel janji temu dan kemudian hapus referensi dari tabel pengguna

Komentar (0)