|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
[MySQL] Garantire l'integrità referenziale con tabelle MyISAM
Ciao a tutti.
Premesso che sono alle prime armi con i database, ho creato un piccolo sito web con un database MySQL. Purtroppo, viste le limitazioni dell'hosting sul quale lo metterò, sono stato costretto ad utilizzare tabelle di tipo MyISAM, le quali non supportano i vincoli di integrità referenziale. Avendo tabelle gerarchiche nel DB la mia domanda è: come faccio a garantite l'integrità dei dati? In particolare, se cancello un record dalla tabella padre come faccio a cancellare tutti i record della tabella figlio e nipote (con il minor numero di query)? Infine, a cosa devo stare attento durante l'inserimento di nuovi record, e quali sono gli accorgimenti che devo seguire per evitare problemi? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prima di tutto devi usare le istruzioni LOCK TABLES all'inizio delle query e UNLOCK TABLES alla fine. Devi bloccare tutte le cartella in scrittura perché devi modificare più o meno tutte le tabelle interessate
Poi chiaramente dipende dalla struttura del database: devi fare le query che ti aspetti che un DB con integrità referenziale ti faccia. Ad esempio: cancelli un ID da una tabella ? Allora vai a cancellare tutti record che fanno riferimento a quell'ID all'interno delle tabelle che secondo te devono mantenere l'integrità referenziale (tutte quelle tabelle che secondo te devono avere l'ID della tabella originale come foreign key). |
|
|
|
|
|
#3 | ||
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
Quote:
Quote:
In pratica, semplificando, ho lo schema seguente: Codice:
Categorie ----------- IdCateg(*) ... Discussioni ----------- IdDisc(*) IdCateg ... Messaggi ----------- IdMsg(*) IdDisc ... (*) Chiave Codice:
1) DELETE FROM categorie WHERE IdCateg = ?IdCateg; 2) DELETE FROM discussioni WHERE IdCateg = ?IdCateg; 3) Per ciascun record cancellato, recupera IdDisc ed esegui 4) DELETE FROM messaggi WHERE IdDisc = ?IdDisc; Leggendo la relativa documentazione ho provato a fare una query DELETE su più tabelle: Codice:
DELETE categorie, discussioni, messaggi FROM categorie, discussioni, messaggi WHERE categorie.IdCateg = ?IdCateg AND discussioni.IdCateg = categorie.IdCateg AND messaggi.IdDisc = discussioni.IdDisc Infatti funziona solo se data una categoria, questa ha discussioni e queste ultime hanno messaggi. Se ad esempio una categoria non ha dicussioni, questa non viene cancellata. Lo stesso accade se una discussione non ha messaggi. Come posso risolvere il problema? |
||
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
Ciao Andrea |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per queste:
1) DELETE FROM categorie WHERE IdCateg = ?IdCateg; 2) DELETE FROM discussioni WHERE IdCateg = ?IdCateg; 3) Per ciascun record cancellato, recupera IdDisc ed esegui 4) DELETE FROM messaggi WHERE IdDisc = ?IdDisc; Opera in senso inverso: DELETE FROM messaggi WHERE IdDisc IN (SELECT IdDisc FROM discussioni WHERE IdCateg = ?IdCateg); DELETE FROM discussioni WHERE IdCateg = ?IdCateg; DELETE FROM categorie WHERE IdCateg = ?IdCateg; |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: May 2006
Messaggi: 69
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:57.




















