Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    select e insert con trigger mysql

    ciao, sto usando un db mysql e dove fare un trigger che mi selezioni le tuple con data < di quella odierna e che mi copi queste tuple in una nuova tabella, e poi le cancelli da quella in questione.
    Il codice che ho fatto è così

    codice:
    delimiter //
    CREATE TRIGGER vecchie_prenotazione
           BEFORE UPDATE ON prenotazioni
             FOR EACH ROW
             BEGIN
             
             IF OLD.data_partenza < CURDATE() THEN INSERT INTO vecchie_prenotazioni VALUES ('', 'OLD.id_camera', 'OLD.tipo', 'OLD.data_arrivo', 'OLD.data_partenza', 'OLD.confermata', 'OLD.nome', 'OLD.telefono', 'OLD.email', 'OLD.richieste', 'OLD.data_prenotazione');
             
             
             END IF;
             
             IF OLD.data_partenza < CURDATE() THEN DELETE FROM prenotazioni WHERE id_prenotazione = OLD.id_prenotazione;
             END IF;
             END; //
    delimiter ;
    però non funziona, non fa nè l'inserimento nella nuova tabella, nè la cancellazione...

    dove sbaglio? come posso vedere se il trigger funziona?


    GRAZIE !!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Puoi inviare le tabelle su cui lavori e il comando update che digiti?Saluti.

  3. #3
    le tabelle sono identiche, semplicemente su una ci 'lavoro' mentre l'altra la uso come archivio

    questa è la struttura


    codice:
    vecchie_prenotazioni` (
      `id_prenotazione` int(11) NOT NULL AUTO_INCREMENT,
      `id_camera` int(11) NOT NULL,
      `tipo` varchar(20) NOT NULL,
      `data_arrivo` date NOT NULL,
      `data_partenza` date NOT NULL,
      `confermata` tinyint(1) NOT NULL,
      `nome` varchar(150) NOT NULL,
      `telefono` varchar(50) NOT NULL,
      `email` varchar(100) NOT NULL,
      `richieste` text NOT NULL,
      `data_prenotazione` datetime NOT NULL,
      PRIMARY KEY (`id_prenotazione`)
    e la funziona update è

    codice:
    UPDATE prenotazioni SET confermata = 2 WHERE id_prenotazione = ".$id_prenotazione;

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    136
    Ciao,secondo me il problema sta nel fatto che vecchie_prenotazioni abbia id_prenotazione come AUTO_INCREMENT.Se non ho capito male vecchie_prenotazioni funge da archivio.Perciò prova a rimuoverlo.Di conseguenza la insert dovrebbe essere questa:
    INSERT INTO vecchie_prenotazioni VALUES ('old.id_prenotazione', 'OLD.id_camera', 'OLD.tipo', 'OLD.data_arrivo', 'OLD.data_partenza', 'OLD.confermata', 'OLD.nome', 'OLD.telefono', 'OLD.email', 'OLD.richieste', 'OLD.data_prenotazione');

    Poi ,anche se è solo una sfumatura,fai un unico if.....then....Spero di esserti stato di aiuto facci sapere.Saluti.

  5. #5
    ma la insert non dovrebbe essere fatta così

    INSERT INTO
    (colonna1, colonna2, ..., colonnaN)
    VALUES
    (valore1, valore2, ..., valoreN)

    ???

  6. #6
    Non devi usare empty ma NULL per l'auto increment

    VALUES (NULL, 'OLD.id_camera', ......

    @optime
    non serve l'elenco dei campi se nel value metti il valore di tutti i campi e nello stesso ordine in cui sono descritti in tabella.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    a parte l'omissione dei nomi delle colonne, a me pare che lo statement sia stato scritto mettendo i nomi delle colonne tra ' ', quindi IMHO sono dei literal - ma non conosco così bene mySQL

  8. #8
    Originariamente inviato da optime
    a parte l'omissione dei nomi delle colonne, a me pare che lo statement sia stato scritto mettendo i nomi delle colonne tra ' ', quindi IMHO sono dei literal - ma non conosco così bene mySQL
    se e' per lo statement per copiare da una tabella all'altra dovrebbe usare insert ... select e non 'OLD.id_camera', 'OLD.tipo', etc. che verrebbero interpretate come semplici stringhe.

    ma il problema e' che dice che le tabelle dovrebbero essere identiche e quindi ci si aspetterebbe avessero anche l'identico id del record e non ognuna un id per proprio conto.

    Ma vedo anche altro. Diciamo che a me piace che i problemi vengano risolti uno alla volta. Almeno si possono capire meglio.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    ho modificato il trigger così

    codice:
    delimiter //
    CREATE TRIGGER vecchie_prenotazioni
           BEFORE UPDATE ON prenotazioni
             FOR EACH ROW
             BEGIN
             
             IF OLD.data_partenza < CURDATE() THEN INSERT INTO vecchie_prenotazioni VALUES (NULL, 'OLD.id_camera', 'OLD.tipo', 'OLD.data_arrivo', 'OLD.data_partenza', 'OLD.confermata', 'OLD.nome', 'OLD.telefono', 'OLD.email', 'OLD.richieste', 'OLD.data_prenotazione');
           
             DELETE FROM prenotazioni WHERE id_prenotazione = OLD.id_prenotazione;
             
             END IF;
             
             END; //
    delimiter ;
    ma non funziona.... non inserisce nè cancella....

  10. #10
    'OLD.id_camera' scritto così, tra apici, NON è il valore di id_camera della tabella OLD, ma bensì proprio 'OLD.id_camera', letterale.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.