Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481

    [mysql] integrità referenziale

    Dalle mie reminescenze dell'SQL scolastico, mi sembra che l'integrità refenziale fosse un principio in base al quale, se ho due tabelle, "fatture" e "righe fattura" legate da una relazione 1 ad n, se cancello una fattura, devo cancellare tutte le righe di "righe fattura" relazionate con la fattura che sto cancellando. C'è un modo per far si che questo accada automaticamente con mysql o devo cancellare a mano con un DELETE ... WHERE tutte le righe?

  2. #2
    per quanto ne so io mysql non implementa l'integrità referenziale e quindi la domanda alla tua risposta è si, se non vuoi avere righe fattura "penzolanti" senza una fattura devi cancellarle a mano tu...

  3. #3
    Originariamente inviato da Gloglotto
    la domanda alla tua risposta
    forse ho sbagliato qualcosa.... VVoVe:

  4. #4
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Devi avere MySQL 4 o superiore e usare tabelle di tipo INNODB. Con quelle l'integrita' referenziale funziona.

    Per il CASCADE, questo puo' essere automatico sia in UPDATE che in DELETE purche' tu lo specifichi quando crei la FOREIGN KEY. Altrimenti penso che tu debba speficicare a mano la keyword CASCADE quando esegui una query.

    Io di abitudine utilizzo il CASCADE automatico, ma presumo che non specificando l'attributo ON DELETE CASCADE ON UPDATE CASCADE quando crei la FOREIGN KEY, se fai un DELETE o un UPDATE con dati collegati senza il CASCADE specificato nella query, la query fallisca perche' cancellare il dato senza cascading violerebbe l'integrita' referenziale.

  5. #5
    Originariamente inviato da *Ray*
    Devi avere MySQL 4 o superiore e usare tabelle di tipo INNODB. Con quelle l'integrita' referenziale funziona.
    Ti ringrazio mi hai reso un'uomo migliore!

  6. #6
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da *Ray*
    Devi avere MySQL 4 o superiore e usare tabelle di tipo INNODB. Con quelle l'integrita' referenziale funziona.

    Per il CASCADE, questo puo' essere automatico sia in UPDATE che in DELETE purche' tu lo specifichi quando crei la FOREIGN KEY. Altrimenti penso che tu debba speficicare a mano la keyword CASCADE quando esegui una query.

    Io di abitudine utilizzo il CASCADE automatico, ma presumo che non specificando l'attributo ON DELETE CASCADE ON UPDATE CASCADE quando crei la FOREIGN KEY, se fai un DELETE o un UPDATE con dati collegati senza il CASCADE specificato nella query, la query fallisca perche' cancellare il dato senza cascading violerebbe l'integrita' referenziale.
    Grazie della spiegazione esauriente, a dire il vero non ho mai messo in pratica l'integrità referenziale, ma solo studiato in teoria cos'è, quindi non è ci abbia capito molto, cercherò di documentarmi, la cosa mi interessa...

  7. #7
    Utente di HTML.it L'avatar di *Ray*
    Registrato dal
    Oct 2000
    Messaggi
    495
    Te la spiego in 5 minuti che si fa prima. L'integrita' referenziale e' uno strumento che serve essenzialmente per mantenere la consistenza dei dati. Il classico esempio e' questo:

    Tabella categoria prodotti:
    codice:
    IDCategoria
    DescrizioneCategoria
    Tabella prodotto
    codice:
    IDProdotto
    IDCategoria
    DescrizioneProdotto
    Per creare un legame fra i due, non fai altro che fare:

    codice:
    ALTER TABLE PRODOTTO
      ADD CONSTRAINT nomeConstraintATuaScelta FOREIGN KEY (`IDCategoria`) REFERENCES CATEGORIAPRODOTTI (IDCATEGORIA)
    Adesso il database sa che c'e' un legame fra questi due campi.

    Se tu adesso provi a inserire un prodotto con un IDCategoria che non esiste, la query fallisce.

    Se provi a eliminare una categoria per cui esiste almeno un prodotto, la query fallisce.

    Se vuoi cancellare una categoria e tutti i suoi prodotti, fai:
    codice:
    DELETE FROM CATEGORIAPRODOTTI WHERE ID=4 CASCADE
    Cosi' tutti i prodotti con categoria=4 vengono cancellati in cascata.

    Analogamente:
    codice:
    UPDATE CATEGORIAPRODOTTI SET ID=5 WHERE ID=4 CASCADE
    fa si' che il DBMS faccia un update automatico a tutti i prodotti con IDCategoria=5 e lo imposti pari a 4.

    Se quando crei la FOREIGN KEY aggiungi la clausola ON DELETE CASCADE e/o ON UPDATE CASCADE, il cascade e' automatico. Non sempre questo e' desiderabile: e' possibile che uno preferisca nella query specificare il CASCADE a mano, a seconda delle scelte e delle necessita'.

  8. #8
    Utente di HTML.it L'avatar di james
    Registrato dal
    Jun 2002
    Messaggi
    1,481
    Originariamente inviato da *Ray*
    Te la spiego in 5 minuti che si fa prima. L'integrita' referenziale e'.
    MITICO, grazie mille, ora è tutto molto più semplice, mi metto all'opera per provare questa soluzione.
    Solo una cosa non trovo, mi hai detto che le tabelle devono essere di tipo INNODB, ma sul phpmyadmin, quando creo una nuova tabella la posso creare solo di questi tipi:
    MyISAM
    Heap
    Merge
    ISAM

    non c'è INNODB

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.