Saya memiliki tabel di mana saya menyimpan semua pesan forum yang diposting oleh pengguna di situs web saya. Strucrue pesan hierarki diimplementasikan menggunakan model himpunan bersarang .
Berikut ini adalah struktur tabel yang disederhanakan:
- Id (KUNCI UTAMA)
- Owner_Id (REFERENSI KUNCI ASING UNTUK ID )
- Parent_Id (REFERENSI KUNCI ASING UNTUK ID )
- tidak tidur
- baiklah
- nlevel
Sekarang, tabelnya terlihat seperti ini:
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| Id | Owner_Id | Parent_Id | nleft | nright | nlevel |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| 1 | 1 | NULL | 1 | 8 | 1 |
| 2 | 1 | 1 | 2 | 5 | 2 |
| 3 | 1 | 2 | 3 | 4 | 3 |
| 4 | 1 | 1 | 6 | 7 | 2 |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
Perhatikan bahwa baris pertama adalah pesan root, dan pohon postingan ini dapat ditampilkan sebagai:
-- SELECT * FROM forumTbl WHERE Owner_Id = 1 ORDER BY nleft;
MESSAGE (Id = 1)
MESSAGE (Id = 2)
Message (Id = 3)
Message (Id = 4)
Masalah saya terjadi ketika saya mencoba menghapus semua baris di bawah yang sama Owner_Id
dalam satu permintaan. Contoh:
DELETE FROM forumTbl WHERE Owner_Id = 1 ORDER BY nright;
Permintaan di atas gagal dengan kesalahan berikut:
Kode Kesalahan: 1451. Tidak dapat menghapus atau memperbarui baris induk: batasan kunci asing gagal (
forumTbl
, CONSTRAINTOwner_Id_frgn
FOREIGN KEY (Owner_Id
) REFERENSIforumTbl
(Id
) PADA HAPUS TANPA TINDAKAN PADA PEMBARUAN TANPA TINDAKAN)
Alasannya adalah bahwa baris pertama , yang merupakan simpul root ( Id=1
), juga memiliki nilai yang sama di Owner_Id
bidangnya ( Owner_Id=1
), dan menyebabkan permintaan gagal karena batasan kunci asing.
Pertanyaan saya adalah: Bagaimana saya bisa mencegah bundaran kendala kunci asing ini dan menghapus baris yang merujuk pada dirinya sendiri? Apakah ada cara untuk melakukannya tanpa terlebih dahulu harus memperbarui the Owner_Id
dari baris root NULL
?
Saya membuat demo skenario ini: http://sqlfiddle.com/#!9/fd1b1
Terima kasih.