Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: DELETE su due tabelle

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    286

    DELETE su due tabelle

    C'è un modo per cancellare due righe da due tabelle con una query DELETE.
    In pratica ho una tabella detta "ordini" e una "prodotti_ordinati" cancello tutti i prodotti da "prodotti_ordinati" con una query tipo
    Codice PHP:
    DELETE FROM prodotti_ordinati WHERE id = (SELECT id FROM ordini WHERE creazione 3600 <= ".time().")  AND checked_out '0'") 
    e poi con un'altra query DELETE cancello la riga nella tabella ordini.

    Ci sarebbe un modo + elegante per fare questa procedura??

    grazie
    Kirk

  2. #2
    mi sembra che funzioni così:

    DELETE FROM prodotti_ordinati a, tabella2 b WHERE a.id = (SELECT id FROM ordini WHERE creazione + 3600 <= ".time().") AND checked_out = '0'") and a.id=b.id
    Forex: forum dedicato al mercato del trading forex

  3. #3
    Un altro modo sarebbe impostare una dipendenza con la regola DELETE. Quando cancelli la chiave esterna vengono eliminate tt le righe in dipendenza dell'altra tabella.
    TUTTAVIA questa sintassi non sempre è portabile (come non lo è quell'altra del post precedente). Io da sempre faccio le delete A MANO e su una tabella alla volta per essere sicuri che funzionino sempre!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  4. #4
    Originariamente inviato da Nunkij
    Un altro modo sarebbe impostare una dipendenza con la regola DELETE. Quando cancelli la chiave esterna vengono eliminate tt le righe in dipendenza dell'altra tabella.
    effettivamente questa è la soluzione migliore..

    nella dichiarazione delle constraint della chiave primaria devi aggiungere on delete cascade
    Forex: forum dedicato al mercato del trading forex

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    286
    grazie per l'aiuto, partendo proprio da queste risposte ho fatto delle ricerche è ho scoperto che con SQLite non posso usare DELETE CASCADE

    sebbene qui c'è descritta la procedura per ovviare a questo tramite un Trigger http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers credo che nel mio caso due query Delete separate vadano + che bene.

    Il punto che non ho chiaro per ora è:
    -come faccio a cancellare la giusta riga nella tabella "ordini". La giusta riga sarebbe quella che non ha righe correlate nella subtabella (le righe nella subtabella sono state cancellate con la prima query)

    qualcosa tipo
    Codice PHP:
    DELETE FROM ordini WHERE creazione 3600 <= ".time()." and (subtabella non esiste

  6. #6
    Beh ovviamente devi fare un discorso INVERSO. Prima cancelli le righe dipendenti e poi quelle indipendenti! Se ti serve una chiave per trovare quelle dipendenti fai una comunissima query select!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    286
    Originariamente inviato da Nunkij
    Beh ovviamente devi fare un discorso INVERSO. Prima cancelli le righe dipendenti e poi quelle indipendenti! Se ti serve una chiave per trovare quelle dipendenti fai una comunissima query select!
    Questo è proprio quello che faccio.
    Cancello prima le righe dipendenti,
    Codice PHP:
    DELETE FROM prodotti_ordinati WHERE id = (SELECT id FROM ordini WHERE creazione 3600 <= ".time().")  AND checked_out '0' 
    poi vado a cancellare quella indipendente

    Codice PHP:
    DELETE FROM ordini WHERE creazione 3600 <= ".time()." and (non ci sono righe correlate dentro prodotti_ordinati
    ....puoi immaginare che ci sono anche delle righe che non voglio cancellare, ...devo cancellare solo le righe che non hanno + righe correlate nella subtabella.

  8. #8
    select TAB1 LEFT JOIN TAB2
    ON ....
    WHERE condizionetab2 IS NULL;


    tiri fuori gli id di ogni riga con una semplice query select dentro un ciclo while e fai le delete singolarmente con gli id come clausola WHERE
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    286
    Originariamente inviato da Nunkij
    select TAB1 LEFT JOIN TAB2
    ON ....
    WHERE condizionetab2 IS NULL;


    tiri fuori gli id di ogni riga con una semplice query select dentro un ciclo while e fai le delete singolarmente con gli id come clausola WHERE
    Posso fare lo stesso ragionamento con una subquery?
    Codice PHP:
    DELETE FROM ordini WHERE creazione 3600 <= ".time()." and id = (SELECT id FROM prodotti_ordinati WHERE id IS NULL

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    286
    per la cronaca.....
    ho risolto così, una query cancella le righe dipendenti (come descritto qualche post fa) e con un'altra, simile a questo sotto, cancello le righe indipendenti
    Codice PHP:
    DELETE FROM ordini WHERE creazione 3600 <= ".time()." and id != (SELECT id FROM prodotti_ordinati
    Grazie
    Kirk

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.