Ich habe Tabelle comment
, und ich möchte durch die Eingabe löschen id
und auch alle Kind löschen,löschen/wählen Hierarchiedaten in postgresql
unter zwei Abfrage beide nicht alle Hierarchiedaten löschen, löschen nur sich selbst und ein Kind Reihe ...
Gibt es etwas falsch, wenn rekursive in with
Schließung auswählen?
Kommentar
id | parent_comment_id
1 |
2 | 1
3 | 2
4 |
Abfrage 1
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
DELETE FROM comment WHERE id IN (
SELECT id FROM coH WHERE rootId = $1
)
Abfrage 2
DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH AS (
SELECT co.id,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId = $1
)
UPDATE
var dbQuery = `DELETE FROM comment WHERE id IN (
WITH RECURSIVE coH (id, parentCommentId, rootId) AS (
SELECT co.id,
co.parent_comment_id as parentCommentId,
co.id AS rootId
FROM comment co
UNION ALL
SELECT coChild.id,
coChild.parent_comment_id as parentCommentId,
coP.rootId
FROM comment coChild
JOIN coH coP ON coP.id = coChild.parent_comment_id
)
SELECT id FROM coH WHERE rootId = $1
)`;
Ihre Anfragen scheinen korrekt, aber Löschung in der falschen Reihenfolge Fremdschlüssel Verletzungen verursachen kann. Sie können dies lösen, indem Sie keinen Fremdschlüssel haben (nicht empfohlen!) Oder indem Sie Ihren Fremdschlüssel mit ON DELETE CASCADE oder DEFERRABLE haben. –
@ZiggyCrueltyfreeZeitgeister Ich fand diese Antwort http://stackoverflow.com/a/10381384/5593189 Ich aktualisiere in meiner Frage, es funktioniert, um alle zu löschen, aber ich weiß nicht warum? Was ist 'coH (id, parentCommentId, rootId)' Klammer für? und im ersten Teil wählen Sie mit warum co.parent_comment_id als ElternCommentId? – user1575921
@ZiggyCrueltyfreeZeitgeister Ich habe den Fremdschlüssel in der Kommentartabelle nicht gesetzt. kann ich 'comment.parent_comment_id' fk' comment.id' setzen? Wenn die Spalte Null sein könnte, kann der Fremdschlüssel trotzdem gesetzt werden? – user1575921