Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    7

    mysql, delete e on restrict

    Salve a tutti,

    per spiegare il problema riporto un esempio:

    codice:
    create table persona(
        id integer primary key auto_increment,
        nome varchar(20)
    );
    
    create table recapito(
        id integer primary key auto_increment,
        recapito varchar(20)
    );
    
    create table collega(
        id integer primary key auto_increment,
        id_persona integer,
        id_recapito,
        foreign key (id_persona) references persona(id) on delete restrict,
        foreign key (id_recapito) references recapito(id) on delete restrict
    );
    Quindi ho tre tabella, una figlia(collega) e le altre due padre.

    Ora dovrei realizzare una query che cancelli una persona(ovviamente anche tutti i suoi recapiti).

    codice:
    DELETE  persona, recapito, collega
    FROM   persona left join collega on persona.id=collega.id_persona
                left join recapito on recapito.id=collega.id_recapito
    WHERE  persona.id = 1;
    Io credevo che il delete eliminasse le tuple in base all' ordine delle tabelle che vengono messe di seguito a "DELETE", invece leggendo in giro ho scoperto che è come se le eliminasse tutte insieme, quindi per i vincoli è un problema, nel senso che quella query funzionerebbe solamente se vengono eliminate le tuple delle tabelle padri e poi quelle della tabella figlia, altrimente il vincolo on delete restrict farebbe restituire un errore.
    La soluzione potrebbe essere quella di eseguire 2 query, per eliminare le tuple sulle tabelle padri e poi su quella figlia, ma mi sembrerebbe poco elegante come soluzione.
    Voi come mi suggerireste di fare?

    p.s.: c'è il vincolo on delete restrict per evitare che vadano a buon fine query come questa:
    delete from collega where id=1;
    p.p.s: mettendo il cascade anziché il restict la seguente query:
    delete from collega where id_persona = 1;
    dovrebbe eliminare anche le tuple nelle tabelle padri giusto? Come la considerate questa alternativa?
    A me sinceramente non piace molto, anche per la leggibilità delle query....

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2008
    Messaggi
    270
    partiamo dal presupposto che in teoria il tuo db non è propiramente esatto.

    una soluzione migliore sarebbe rendere il recapito "figlio" di persona.(è solo un consiglio poi fai tu)

    detto questo basta che metti on delete cascade, on update cascade alle tabelle "padre" cosi che quando cambi o elimini qualcosa i cambiamenti si riperquotono anche sulle "figlie" (questo se non vuoi tenere conto di uno storico di cambiamenti/cancellazioni)

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.