Ich habe eine Tabelle, in der ich alle Forumsnachrichten speichere, die von den Benutzern auf meiner Website gepostet wurden. Die Nachrichten Hierarchie strucrue ist implementieren unter Verwendung eines Nested Sets .
Das Folgende ist eine vereinfachte Struktur der Tabelle:
- Id (PRIMARY KEY)
- OWNER_ID (FOREIGN KEY VERWEISE AUF Id )
- PARENT_ID (FOREIGN KEY VERWEISE AUF Id )
- nleft
- in Ordnung
- nlevel
Jetzt sieht der Tisch ungefähr so aus:
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| 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 |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
Beachten Sie, dass die erste Zeile die Stammnachricht ist und der Baum dieses Beitrags wie folgt angezeigt werden kann:
-- SELECT * FROM forumTbl WHERE Owner_Id = 1 ORDER BY nleft;
MESSAGE (Id = 1)
MESSAGE (Id = 2)
Message (Id = 3)
Message (Id = 4)
Mein Problem tritt auf, wenn ich versuche, alle Zeilen unter derselben Owner_Id
in einer einzigen Abfrage zu löschen . Beispiel:
DELETE FROM forumTbl WHERE Owner_Id = 1 ORDER BY nright;
Die obige Abfrage schlägt mit folgendem Fehler fehl:
Fehlercode: 1451. Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (
forumTbl
, CONSTRAINTOwner_Id_frgn
FOREIGN KEY (Owner_Id
) REFERENCESforumTbl
(Id
) ON DELETE NO ACTION ON UPDATE NO ACTION)
Der Grund dafür ist, dass die erste Zeile , bei der es sich um den Stammknoten ( Id=1
) handelt, ebenfalls denselben Wert in ihrem Owner_Id
Feld ( Owner_Id=1
) hat und die Abfrage aufgrund der Fremdschlüsseleinschränkung fehlschlägt.
Meine Frage lautet: Wie kann ich diese Zirkularität von Fremdschlüsseleinschränkungen verhindern und eine Zeile löschen, die auf sich selbst verweist? Gibt es eine Möglichkeit, dies zu tun, ohne zuerst das der Stammzeile aktualisieren Owner_Id
zu müssen NULL
?
Ich habe eine Demo dieses Szenarios erstellt: http://sqlfiddle.com/#!9/fd1b1
Vielen Dank.
quelle