Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178

    [MySQL] verifica l'esistenza di un record con EXISTS e SELECT

    se ho una tabella che contiene degli ordini relativi a un videonoleggio e voglio evitare che si aprano più ordini relativi allo stesso prodotto nello stesso periodo di tempo(evitare che si sovrappongano insomma) come scrivo la condizione per far interrogare la tabella prima dell'inserimento e verificare quanto detto sopra?

    ho bisogno di verificare quindi che non esistano record dove:
    la data di fine sia maggiore di quella di inizio all'inserimento
    la data di inizio sia minore della data di fine all'inserimento

    graficamente :
    nol1.............in---------------fi

    nol2.............................................. ........................in----------------------fi

    nol3...............................in-----------------------------------fi

    ho pensato a una cosa simile :
    codice:
    CREATE TRIGGER ValidateNol
    BEFORE INSERT ON Nol
    FOR EACH ROW BEGIN
    
    
    IF EXISTS (SELECT DataInizio,DataFine FROM tabella
    WHERE DataFine>NEW.DataInizio AND DataInizio<NEW.DataFine) THEN
    SET NEW.prodID=null;
    
    END IF;
    
    END;
    //

    però non sono sicuro possa funzionare...gli attributi sarebbero di tipo DATETIME, ma nella documentazione ho letto che EXISTS restituisce TRUE anche se trova solo valori nulli, vorrei sapere allora se questa istruzione servirebbe allo scopo...
    è troppo impegnativo...

  2. #2
    Utente di HTML.it L'avatar di r1cky`
    Registrato dal
    Feb 2007
    Messaggi
    431
    Uhm non mi pare che l'exists si possa usare in quel modo, ne tantomeno puoi fare una select del genere dentro un trigger

    Io farei una roba del genere:

    codice:
    CREATE TRIGGER ValidateNol
    BEFORE INSERT ON Nol
    FOR EACH ROW BEGIN
    
    DECLARE counter tinyint;
    
    /*Conti quanti record ci sono che corrispondono. immagino ci voglia anche il controllo sull'id del film che intende nolleggiare*/
    
    SELECT COUNT(*) INTO counter FROM tabella
    WHERE DataFine>NEW.DataInizio AND DataInizio<NEW.DataFine;
    
    IF counter>0 THEN
    /*Gestione dell'errore*/
    END IF;
    
    
    END;
    //
    Fammi sapere

  3. #3
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    non saprei, avevo trovato una discussione che però è incentrata sul NOT EXISTS

    ma anche l'idea del count non è male, visto che l'effetto è lo stesso

    in effetti mi ero dimenticato di includere il controllo sull'oggetto, la select sarebbe una cosa del genere :

    SELECT DataInizio,DataFine FROM tabnol
    WHERE prodotto=NEW.prodotto AND (DataFine>NEW.DataInizio AND DataInizio<NEW.DataFine)


    faccio qualche test e vedo come fungono...
    è troppo impegnativo...

  4. #4
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    credo che la tua sia la soluzione migliore, imposto la select come segue :

    codice:
    SELECT COUNT(*) INTO counter FROM tabella
    WHERE prodotto=NEW.prodotto AND (DataFine>NEW.DataInizio OR DataInizio<NEW.DataFine)

    ho corretto anche l'operatore logico, così dovrebbe andare...
    è troppo impegnativo...

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.