Autore Topic: SQLite Gestione chiave esterna  (Letto 639 volte)

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
SQLite Gestione chiave esterna
« il: 03 Aprile 2015, 18:05:39 CEST »
0
Ciao, ho un piccolo dilemma per il mio database e cioè:
ad esempio, ho 3 tabelle,
la tabella 1 è così composta:
Codice (Java): [Seleziona]
id_prodotto
nome_prodotto
colore_prodotto
la 2 tabella è così composta:
Codice (Java): [Seleziona]
id_cliente
nome_cliente
cognome_cliente
nella tabella 3 vengono memorizzati i vari movimenti, cioè il cliente che ha acquistato un determinato prodotto:
Codice (Java): [Seleziona]
id_movimento
id_prodotto
id_cliente
per recuperare i clienti ed i prodotti ad esso associati faccio una query con LEFT JOIN e tutto funziona a dovere.

Il problema nasce quando vado ad eliminare un prodotto o un cliente (tabella1 o tabella2), in questo caso, ovviamente, l'id del cliente o del prodotto eliminato non viene trovato!!!
Come posso aggirare il tutto??
Grazie
 

iClaude

  • Visitatore
Re:SQLite Gestione chiave esterna
« Risposta #1 il: 07 Aprile 2015, 15:39:38 CEST »
0
Se hai usato le foreign keys il sistema non ti permette di cancellare una chiave referenziata in un'altra tabella,  a meno che tu non abbia usato "ON DELETE CASCADE", nel qual caso ti cancella tutti i record contenenti quella chiave. Ciò appunto per evitare la situazione che hai descritto.
Sei sicuro di aver impostato e attivato correttamente le foreign keys?

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:SQLite Gestione chiave esterna
« Risposta #2 il: 07 Aprile 2015, 16:58:34 CEST »
0
Ciao, in pratica devo mantenere lo storico, quindi, a quanto pare, l'unico modo è inserire un campo boolean con il quale non visualizzo più il record eliminato ma in realtà esiste ancora nella tabella....

Ora, se puoi leggere un altro mio post sarei felice di ricevere un consiglio/aiuto:
http://www.anddev.it/index.php/topic,16205.0.html

grazie

iClaude

  • Visitatore
Re:SQLite Gestione chiave esterna
« Risposta #3 il: 07 Aprile 2015, 17:31:29 CEST »
0
Ciao, in pratica devo mantenere lo storico, quindi, a quanto pare, l'unico modo è inserire un campo boolean con il quale non visualizzo più il record eliminato ma in realtà esiste ancora nella tabella....

No, se hai impostato correttamente le foreign keys (prova a googolare...) ci sono 2 alternative:
a) se hai usato "ON DELETE CASCADE" allora quando cancelli una chiave vengono cancellati tutti i record contenenti tale chiave nelle tabelle che utilizzano questa foreign key
b) in caso contrario se tenti di cancellare una chiave referenziata in un'altra tabella il sistema non te lo fa fare (ottieni un'eccezione), ed è giusto così, altrimenti finiresti per avere record che utilizzano una chiave non più esistente.

Per questo ho il sospetto che tu non abbia impostato correttamente le foreign keys oppure che tu non le abbia attivate.

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:SQLite Gestione chiave esterna
« Risposta #4 il: 07 Aprile 2015, 17:36:53 CEST »
0
si ho visto come funziona "ON DELETE CASCADE".
Ma la mia esigenza è di permettere la cancellazione di un prodotto/cliente, e allo stesso tempo mantenere i "movimenti" associati a quel prodotto/cliente nella terza tabella.

iClaude

  • Visitatore
Re:SQLite Gestione chiave esterna
« Risposta #5 il: 07 Aprile 2015, 17:39:56 CEST »
0
si ho visto come funziona "ON DELETE CASCADE".
Ma la mia esigenza è di permettere la cancellazione di un prodotto/cliente, e allo stesso tempo mantenere i "movimenti" associati a quel prodotto/cliente nella terza tabella.

Così però non ha molto senso usare le foreign keys, perchè nella terza tabella hai solo l'id del prodotto/cliente, ma non puoi più recuperare le relative informazioni perchè l'hai cancellato dalla prima.

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:SQLite Gestione chiave esterna
« Risposta #6 il: 07 Aprile 2015, 17:48:24 CEST »
0
per questo nelle tabelle prodotti/clienti, inserisco un campo 0(eliminato), 1(visibile), in realtà per mantenere lo storico non posso eliminare fisicamente i record altrimenti avrei una eccezione nella terza tabella.

Ho riflettuto su come agire e le possibilità sembrano solo 2:
o faccio come descritto sopra, oppure nella terza tabella non inserisco gli id dei prodotti/clienti ma memorizzo ogni volta il nome del prodotto/cliente, avendo però una enorme ridondanza dei dati.

Tu come faresti?

iClaude

  • Visitatore
Re:SQLite Gestione chiave esterna
« Risposta #7 il: 07 Aprile 2015, 21:08:48 CEST »
0
per questo nelle tabelle prodotti/clienti, inserisco un campo 0(eliminato), 1(visibile), in realtà per mantenere lo storico non posso eliminare fisicamente i record altrimenti avrei una eccezione nella terza tabella.

Ho riflettuto su come agire e le possibilità sembrano solo 2:
o faccio come descritto sopra, oppure nella terza tabella non inserisco gli id dei prodotti/clienti ma memorizzo ogni volta il nome del prodotto/cliente, avendo però una enorme ridondanza dei dati.

Tu come faresti?

La prima soluzione direi che è la migliore.
Oppure, se proprio non ti interessano più le informazioni associate ad un dato cliente/prodotto, crei una chiave specifica nelle tabelle clienti e prodotti del tipo "cliente eliminato"/"prodotto eliminato", e quando vuoi eliminare un prodotto/cliente, prima cambi la chiave dei movimenti interessati con questa chiave specifica, quindi la elimini dalla tabella.

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:SQLite Gestione chiave esterna
« Risposta #8 il: 07 Aprile 2015, 22:35:15 CEST »
0
infatti, come pensavo, il campo si/no nelle tabelle è l'unica soluzione "pulita".

Puoi leggere questo post?
Array da Fragment a Classe - Android Developers Italia