[RISOLTO]SQLite Gestione chiave esterna

di il
7 risposte

[RISOLTO]SQLite Gestione chiave esterna

Ciao, ho un piccolo dilemma per il mio database e cioè:
ad esempio, ho 3 tabelle,
la tabella 1 è così composta:

id_prodotto
nome_prodotto
colore_prodotto
la 2 tabella è così composta:

id_cliente
nome_cliente
cognome_cliente

nella tabella 3 vengono memorizzati i vari movimenti, cioè il cliente che ha acquistato un determinato prodotto:

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

7 Risposte

  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Ciao, considera che di base il supporto per le foreign keys è disabilitato, per cui devi abilitarlo con la seguente riga di codice:
    PRAGMA foreign_keys=ON;
    Se abiliti il supporto alle foreign keys allora quando provi a cancellare un cliente/prodotto che è presente anche nella tabella dei "movimenti" allora ti viene lanciata un'eccezione.
    Se vuoi che cancellando un cliente/prodotto vengano cancellate anche le relative righe nella tabella "movimenti" allora puoi specificare la foreign key con l'azione ON DELETE, ad esempio:
    
    CREATE TABLE Movimenti (
       ....
       id_prodotto INTEGER REFERENCES Clienti(id_cliente) ON DELETE CASCADE,
       ...
    );
    
    Un discorso analogo vale per le operazioni di UPDATE, per le quali puoi specificare eventualmente l'azione ON UPDATE.

    Di default se non specifichi nessuna di queste 2 azioni allora viene impostato ON DELETE NO ACTION ON UPDATE NO ACTION
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    X Evans: hai creato due discussioni identiche in violazione del regolamento...
    Ho cancellato la più vecchia, detto questo ti esorto a leggere e rispettare il regolamento del forum
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Sì scusate il doppio post.

    X Della:
    Forse mi sono spiegato male, il problema è che se elimino un cliente/prodotto voglio ugualmente che il cliente /prodotto venga visualizzato nella tabella movimenti. Ho utilizzato le chiavi esterne per evitare la ridondanza.
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Ciao, esistono diverse cose che puoi fare per mantenere lo storico.
    La più semplice è non eliminare fisicamente i record dei prodotti o clienti ma effettuare una cancellazione virtuale.
    Significa che puoi mettere nelle tabelle clienti e prodotti un "flag cancellato" meglio se abbinato a "data cancellazione".
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Sì infatti avevo pensato ad un campo boolean (si/no).
    Però lavorando in Android e con una grande quantità di dati potrei avere dei problemi di "velocità " dell"app.

    A questo punto mi chiedevo se conviene "ridondare " i dati nella tabella movimenti fosse la soluzione "brutta " ma la migliore.
    che dite?
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Secondo me non ci dovrebbero essere problemi, i DB sono ottimizzati per lavorare con tanti dati. Se poi fai le operazioni su un altro thread non hai problemi di "scattosità"..
    La soluzione di toki mi sembra la migliore se vuoi comunque mantenere lo storico, perché con altre soluzioni perdi per forza di cose la connessione fra il movimento ed il cliente
  • Re: [RISOLTO]SQLite Gestione chiave esterna

    Ok, grazie farò con il campo boolean.
Devi accedere o registrarti per scrivere nel forum
7 risposte