Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [sql] vincoli di integrità - cancellazione

    mysql da errore

    codice:
    DELETE FROM prodotto 
    JOIN articolo ON articolo.prodotto=prodotto.idprodotto
    JOIN associazione ON associazione.articolo=articolo.idarticolo
    WHERE idprodotto='55'
    a questo punto penso proprio che non si possa fare....

    Come posso fare questa cancellazione multipla?

    un prodotto possiede piu articoli
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  2. #2
    Hai piu possibilita:
    1) Nel vincolo di integrita che collega le tabelle definisci cosa fare in caso di cancellazione dalla tabella principale (on delete, on update)

    2) Fai piu query ma le metti in una singola transazione
    di solito va fatto in php seguendo questi passi:
    a) levare l'autocommit
    b) BEGIN WORK
    c) DELETE ....
    d) DELETE ....
    e1) se ci sta un errore in qualsiasi punto ROLLBACK
    e2) se tutto va bene COMMIT
    f) rimettere l'autocommit

    Come vuoi fare tu non e' fattibile (per quanto ne so) non si puo cancellare piu righe da piu tabelle senza usare i sistemi sopra elencati o quello delle view (sotto)

    Il modo che piu si avvicina e' usare una view nella quale hai definito le regole di cancellazione (in pgsql si chiamano rules)
    Frank Contrepois
    http://contrepois.blogspot.com
    http://www.coblan.it

  3. #3
    [supersaibal]Originariamente inviato da frank-coblan
    Hai piu possibilita:
    1) Nel vincolo di integrita che collega le tabelle definisci cosa fare in caso di cancellazione dalla tabella principale (on delete, on update)

    2) Fai piu query ma le metti in una singola transazione
    di solito va fatto in php seguendo questi passi:
    a) levare l'autocommit
    b) BEGIN WORK
    c) DELETE ....
    d) DELETE ....
    e1) se ci sta un errore in qualsiasi punto ROLLBACK
    e2) se tutto va bene COMMIT
    f) rimettere l'autocommit

    [/supersaibal]
    Puoi fare un esempio di entrambi i casi?
    cos'e' l'autocommit?
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  4. #4
    L'autocommit e' un impostazione che fa si che dopo ogni query i dati vengano scritti (se necessario) nella banca dati.
    Ne nostro caso vogliamo eseguire piu query ma vogliamo che il tutto venga scritto (o cancellato per noi ) solo se tutto e' andato a buon fine. E' come l'undo se vuoi
    levare l'autocommit varia da dbms a dbms

    Se il tuo db sopporta le transazioni

    BEGIN WORK
    --uso anche una subquery
    DELETE FROM articolo WHERE idarticolo IN SELECT idarticolo FROM associazione WHERE prodotto = '55';
    DELETE FROM prodotto WHERE idprodotto = '55';
    DELETE FROM associazione WHERE prodotto = '55';
    COMMIT

    Se anche solo una delle query di delete va a male tutte le altre eventualmente gia fatte vengono annullate (W le transazioni)

    Nel caso che proponevo in 1) e' un dato che va scelto in sede di progettazione (di solito) cmq ecco un link che ti spiega un po tutto http://www.html.it/sql/sql_07.htm e http://members.xoom.virgilio.it/simo...tml/nuova.html e http://www.guidainlinea.com/sql/guida/ (trovati con google) come libro prendi "Basi di dati" Atzeni, Ceri, Paraboschi, Merialdo (mi pare)

    NB: nel tuo caso hai usato 3 tb quando secondo me ne bastavano 2 visto che e' una relazione 1-N che avrebbe evitato la subquery
    Frank Contrepois
    http://contrepois.blogspot.com
    http://www.coblan.it

  5. #5
    [supersaibal]Originariamente inviato da frank-coblan
    L'autocommit e' un impostazione che fa si che dopo ogni query i dati vengano scritti (se necessario) nella banca dati.
    Ne nostro caso vogliamo eseguire piu query ma vogliamo che il tutto venga scritto (o cancellato per noi ) solo se tutto e' andato a buon fine. E' come l'undo se vuoi
    levare l'autocommit varia da dbms a dbms

    Se il tuo db sopporta le transazioni

    BEGIN WORK
    --uso anche una subquery
    DELETE FROM articolo WHERE idarticolo IN SELECT idarticolo FROM associazione WHERE prodotto = '55';
    DELETE FROM prodotto WHERE idprodotto = '55';
    DELETE FROM associazione WHERE prodotto = '55';
    COMMIT

    Se anche solo una delle query di delete va a male tutte le altre eventualmente gia fatte vengono annullate (W le transazioni)

    Nel caso che proponevo in 1) e' un dato che va scelto in sede di progettazione (di solito) cmq ecco un link che ti spiega un po tutto http://www.html.it/sql/sql_07.htm e http://members.xoom.virgilio.it/simo...tml/nuova.html e http://www.guidainlinea.com/sql/guida/ (trovati con google) come libro prendi "Basi di dati" Atzeni, Ceri, Paraboschi, Merialdo (mi pare)

    NB: nel tuo caso hai usato 3 tb quando secondo me ne bastavano 2 visto che e' una relazione 1-N che avrebbe evitato la subquery [/supersaibal]
    Le select annidate e autocommit mysql credo che non le supporti (devo controllare)

    Il libro di base di dati e' fenomenale!!! ce l'ho!!!

    Le tre tabelle sono giustificate. La terza tabella "associazione" scaturisce da una relazione molti a molti con un'altra tabella...

    Tu ne sai qualcosa in merito a mysql?
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

  6. #6
    no non uso mysql
    Frank Contrepois
    http://contrepois.blogspot.com
    http://www.coblan.it

  7. #7
    Le select annidate sono supportate dalla vers 4 in poi
    il commit è supportato ma non sono riuscito a farlo funzionare

    Qualcuno sa come si fa?
    Trinity
    http://www.vocabolariodidio.it
    http://www.giulianodelena.com
    trova la tua casa per le vacanze
    http://www.salento.lecce.it

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.