Domanda

Sto cercando di assicurarmi che alcuni dati vengano eliminati automaticamente quando non ci sono più riferimenti usando le eliminazioni in cascata. Spiegherò con un database falso basato su Stack Overflow.

Ho una Post tabella. Ogni post ha zero a molti tag.

Quindi dovrebbe apparire come:

  

Pubblica < - > PostTags & Lt; - & Gt; Tag

ad es.

  

Il post 1 ha i tag 'A', 'B', 'C' Post 2   ha i tag 'C', 'D'.

ora, quello che sto facendo è che quando elimino tutti i tag per il post 2 (es. DELETE FROM PostTags WHERE PostId = 2), vorrei che anche il tag 'D' venisse cancellato perché nessun altro se ne fa riferimento. Pensavo che le eliminazioni in cascata lo avrebbero gestito, ma ovviamente è solo se si scende da Tag->PostTags o Post->PostTags.

Non sono sicuro di come gestirlo.

Temo che le persone suggeriranno di utilizzare un trigger :( (ulteriore complessità del sistema).

Pensieri?

Nota: DB è MS Mq2008.

È stato utile?

Soluzione

Sfortunatamente, non potrai usare le cascate qui. Le cascate non funzionano quando hai relazioni molte-a-molte perché non avrai un genitore singolare che fa riferimento al figlio (in questo caso, hai più voci PostTag che potrebbero fare riferimento alla tabella Tag).

I trigger sarebbero un modo per farlo, ma non lo consiglierei. Piuttosto, suggerirei che nel livello dati, dopo aver eliminato le voci nella tabella PostTags, eliminare i tag a cui non si fa più riferimento. Se hai una procedura memorizzata che comporta l'eliminazione della voce, potresti prendere in considerazione l'idea di farlo lì (sarebbe relativamente semplice da fare).

Altri suggerimenti

Penso che devi usare un trigger on delete sulla tabella Posts, che controlla i tag del post che vengono eliminati e li elimina se non vengono citati (nella tabella PostTags).

Prima di eliminare il tuo post, salva questo recordset:

SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;

Quindi, dopo averlo eliminato, scorrere questo recordsoet e se count (*) è = 1, quindi eliminare il tag.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top