Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60

    [mysql] trigger con IF not exist

    ciao a tutti, ho questo codice che non vuole proprio funzionare.. il problema come al solito è aggravato anche dalla pessima gestione degli errori di sintassi di Mysql..

    codice:
    CREATE TRIGGER testindex AFTER INSERT ON test_table_1
    FOR EACH ROW
    IF NOT EXISTS(SELECT * FROM `index` WHERE index_id = 1 AND anno = 2007 AND mese = DATE_FORMAT(NOW( ), '%m');)
    THEN
    INSERT INTO `index` (index_id, email, dominio, type, num, size, anno, mese) VALUES ('', 'nome', 'dominio.it', 'IN', 0, 0, DATE_FORMAT(NOW(), '%Y'), DATE_FORMAT(NOW(),'%m') );
    END IF;
    Ho provato anche utilizzando il BEGIN ... END ma con una sola operazione la versione 5.0.45 di Mysql (quella che monto) dà errore

    questo codice SQL restituisce, su PhpMyAdmin:

    query SQL: Documentazione

    CREATE TRIGGER testindex AFTER INSERT ON test_table_1
    FOR EACH
    ROW
    IF NOT
    EXISTS (

    SELECT *
    FROM `index`
    WHERE index_id =1
    AND anno =2007
    AND mese = DATE_FORMAT( NOW( ) , '%m' )

    Messaggio di MySQL: Documentazione
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
    Qualcuno sa dirmi dov'è il problema? Sto impazzendo...
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Hai cambiato il delimitatore?
    Scommetto di no

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    il DELIMITER?

    sia terminandolo con // che ; che con $$ , mi da subito errore. Potrebbe essere un problema di phpmyadmin che è ancora alla versione 2.6; dovrebbero aggiornarlo alla 2.10 a breve

    ma il delimiter lo devo usare anche se creo una cosa sola? pensavo servisse nel caso scrivessi ad esempio

    CREATE TABLE
    etc...

    DELIMITER

    CREATE TRIGGER
    etc...

    o sbaglio?

    grazie mille!
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Secondo me dovresti usare il client mysql; ho l'impressione che phpmyadmin abbia dei problemi a gestire quella roba.

    Il problema del delimiter non dipende da quante istruzioni hai messo, ma dal fatto di avere il delimiter stesso contenuto nel codice del trigger; te lo dimostra il fatto che nella risposta che hai postato, il codice "citato" da phpmyadmin si ferma proprio dove hai il punto e virgola

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    scusa ma non ho capito: lo devo utilizzare quindi per forza il delimiter? all'inizio e alla fine del codice per creare il trigger, giusto?
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Esatto, ma dubito che tu riesca a farlo con phpmyadmin

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    fatto con shell al primo colpo! era proprio phpmyadmin! grazie dell'aiuto!
    quoto il codice giusto per chiarezza:

    DELIMITER $$

    CREATE TRIGGER testindex AFTER INSERT ON test_table_1
    -> FOR EACH
    -> ROW
    -> BEGIN
    -> IF NOT
    -> EXISTS (
    ->
    -> SELECT *
    -> FROM `index`
    -> WHERE index_id =1
    -> AND anno = DATE_FORMAT(NOW(), '%Y')
    -> AND mese = DATE_FORMAT( NOW( ) , '%m' )
    -> )
    -> THEN
    -> INSERT INTO `index` ( index_id, email, dominio, tipo, num, size, anno, mese )
    -> VALUES (
    -> '10', 'mail@mail.it', dominio.it, 'IN', 1, 1, DATE_FORMAT( NOW( ) , '%Y' ), DATE_FORMAT( NOW( ) , '%m' )
    -> );
    -> END IF $$

    DELIMITER ;

    dopo un inserimento nella tabella "test_table_1" effettua un controllo sulla tabella "index"; se non è presente un record con index_id = 1, l'anno e il mese correnti, lo inserisce
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    sono riuscito a farlo quasi tutto, mi dà però un errore nell'ultima riga, dove c'è l'END, e non so propio perchè

    provo a postare il codice, magari qualcno sa darmi un aiuto..

    grazie

    DELIMITER //

    CREATE TRIGGER updateindex
    AFTER INSERT ON `dominioprova_it@giacomo`
    FOR EACH ROW

    BEGIN

    DECLARE tipomsg tinyint;
    SET tipomsg = NEW.`IN`;

    IF NOT EXISTS ( SELECT * FROM `index` WHERE email = 'giacomo' AND dominio = 'dominioprova.it' AND anno = DATE_FORMAT(NOW(),'%Y') AND mese = DATE_FORMAT(NOW(),'%m'))
    THEN

    IF (tipomsg = 1 ) THEN /* E' un messaggio in ingresso */
    INSERT INTO `index` ( index_id, email, dominio, type, num, size, anno, mese )
    VALUES ('', 'giacomo', 'dominioprova.it', 'IN',1, NEW.size,DATE_FORMAT(NOW(),'%Y'),DATE_FORMAT(NOW() ,'%m'));

    INSERT INTO `index` ( index_id, email, dominio, type, num, size, anno, mese )
    VALUES ('', 'giacomo', 'dominioprova.it', 'out', 0, 0, DATE_FORMAT(NOW(),'%Y'), DATE_FORMAT(NOW(),'%m'));

    ELSE IF (tipomsg = 0 ) THEN
    INSERT INTO `index` ( index_id, email, dominio, type, num, size, anno, mese )
    VALUES ('', 'giacomo','dominioprova.it','in',0,0,DATE_FORMAT(N OW(),'%Y'),DATE_FORMAT(NOW(),'%m'));

    INSERT INTO `index` ( index_id, email, dominio, type, num, size, anno, mese )
    VALUES ('', 'giacomo_fusaro', 'dominioprova.it', 'out', 1, NEW.size, 2008, 01);

    ELSE

    SET tipomsg = NEW.`IN`;

    IF (tipomsg = 1 ) THEN
    UPDATE `index` SET num = num + 1, size = size + NEW.size WHERE email = 'giacomo';

    ELSE

    UPDATE `index` SET num = num + 1, size = size + NEW.size WHERE email = 'giacomo;
    END IF;
    END;
    //
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da Giakie
    mi dà però un errore nell'ultima riga
    Faceva schifo dire quale vero?

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    eheh, hai ragione scusa.. è tutto il giorno che ci lavoro e sono un po' fuso...



    anche perchè il problema nasce proprio dal fatto che l'errore non mi dice nulla

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 25
    Non esiste niente di più serio dell'arte; e non esiste niente di meno serio dell'artista. (O.Wilde)

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.