Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56

    Gestire le relazioni in mysql

    Salve, vorrei migliorere la mia conoscenza delle relazioni in mysql

    Per gestire un database ho sempre creato tabelle ''slegate'', senza utilizzare le chiavi esterne, e ho sempre gestito io manualmente tutte le casistiche di cancellazione update ecc.

    Vorrei imparare a utilizzare le chiavi esterne e vorrei un esempio pratico, ho già letto la guida su questo forum ma vorrei capire in sostanza cosa avviene e come. Mi spiego meglio con un esempio.

    Creo queste due tabelle:

    CREATE TABLE editore (
    id INT auto_increment,
    nome VARCHAR (200),
    stato bool;
    PRIMARY KEY id (id))
    TYPE=InnoDB;

    CREATE TABLE libro (
    id INT auto_increment,
    titolo VARCHAR (200),
    editore INT NOT NULL,
    PRIMARY KEY id (id),
    stato bool;
    INDEX editore_key (editore),
    FOREIGN KEY (editore) REFERENCES editore(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    TYPE=InnoDB;

    proprio come nell'esempio delle guida, ho preso le stesse tabelle ma ho aggiunto un ulteriore campo, il campo stato in editore e in libro che mi dice se un editore o un libro è abilitato o no.
    link: http://www.html.it/articoli/foreign-...le-in-mysql-3/

    Vorrei modificare questo esempio per fare in modo che nel momento in cui disabilito un editore, tutti i libri ad esso legati vengono disabilitati.

    Grazie.

  2. #2
    ciao,
    quello che vuoi fare non centra con le relazioni.
    Un esempio che puoi gestire con le relazioni (restando sulle due tabelle che ci hai fornito) è che se elimini un editore puoi eliminare in automatico i suoi libri, modificando ON DELETE NO ACTION con ON DELETE CASCADE.

    Per il discorso di disabilitare tutti i libri quando viene disabilitato un editore lo puoi gestire con un trigger che viene scatenato quando si fa l'update della tabella editore.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Quote Originariamente inviata da nicolabiondo Visualizza il messaggio
    ciao,
    quello che vuoi fare non centra con le relazioni.
    Un esempio che puoi gestire con le relazioni (restando sulle due tabelle che ci hai fornito) è che se elimini un editore puoi eliminare in automatico i suoi libri, modificando ON DELETE NO ACTION con ON DELETE CASCADE.

    Per il discorso di disabilitare tutti i libri quando viene disabilitato un editore lo puoi gestire con un trigger che viene scatenato quando si fa l'update della tabella editore.
    Interessante questa cosa del trigger, dove posso approfondire?
    È una cosa che si setta sempre da sql o devo programmare io con un altro linguaggio? Tipo con php e simili insomma..

    E invece "on update" che gestisce? Credevo che questa voce mi permetteva di gestire questo caso.

  4. #4
    I trigger sono delle istruzioni SQL che vengono scatenate quando viene fatta una determinata operazione (INSERT, UPDATE oppure DELETE) su una tabella.
    Trovi un sacco di tutorial online (anche in questo sito) che spiegano come funzionano e come creare trigger.

    Nel tuo specifico caso ti servirà un trigger "ON UPDATE".

    Nessuno ti vieta di gestire questa cosa anche da PHP o da qualsiasi altro linguaggio di programmazione con cui avrai scritto la tua utility.
    Nel momento del salvataggio della form o della pagina web dei dati dell'editore lanci una query del tipo UPDATE libro SET stato=0 WHERE editore = ?
    Dove al ? devi sostiuite l'id dell'editore che stai aggiornando.

    ON UPDATE CASCADE riguarda sempre i vincoli di chiave esterna e ha senso solo se la chiave primaria non è di tipo AUTOINCREMENT (in quanto un campo di questo tipo non può essere aggiornato). Se aggiorni il valore della chiave primaria questo verrà propagato in tutte le tabelle che hanno il vincolo di chiave esterna con quella chiave primaria.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    ok quindi le chiavi esterne servono principalmente per avere una buona integrità e consistenza dei dati.
    Peri i trigger ho trovato la guida sempre qui sul forum, inizio a leggerla poi se ho dubbi chiederò sempre sul forum, magari aprendo un topic a parte.

    Adesso ho un'altra domanda, sempre sulle relazioni, mettiamo il caso come nell'esempio, debba gestire questa relazione una a molti, dato che un solo editore può pubblicare più libri.

    è più pesante effettuare una join oppure fare due query una dietro l'altra, magari la prima per prelevare l'id dell'editore e l'altra per prelevare tutti i libri che ha pubblicato?

  6. #6
    ciao,
    questo link forse ti può aiutare a capire la tua richiesta

    http://stackoverflow.com/questions/3...simple-selects

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    56
    Ho da un occhiata, come pensavo le join pesano molto e quindi influiscono sul tempo, per risparmiare sempre su tempo e leggibilità posso risolvere anche con select nidificate o è peggio?

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.