Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101

    MySQL Trigger con parametro

    Salve, ho bisogno di un aiuto per un trigger che non mi riesce fare….
    Allora ho fatto un progettino per la scuola che prevede la gestione di una catena di musei….
    C’è una tabella opere e una tabella che contiene l’elenco dei musei con chiave primaria idmuseo…
    Ora io volevo fare un trigger che quando si andava ad aggiungere una nuova opera nella tabella opere automaticamente il trigger aumentava di uno il contatore opere presenti nel museo dove l’opera era stata aggiunta…. Quindi devo passare al trigger e alla funzione che richiama la variabile idmuseo…. Come faccio ?? io ho buttato giù qualcosa ma nn mi torna niente…

    E inoltre nn so come far incrementare di uno il campo opere_contenute… nn so che comando usare mi potete aiutare ?? questo è quello che ho scritto io :
    prima creo la funzione che aumenta di uno poi il trigger
    anche nella funzione non so se usare INTERT o altro… HELPPP


    CREATE OR REPLACE FUNCTION incrementa_opere_museo(idmuseo) RETURNS TRIGGER AS $incrementa_opere_museo$

    BEGIN

    INSERT INTO “Museo”.numero_opere_presenti WHERE idmuseo=idmuseo ( qui qualcosa nn mi torna come lo metto quello che c'era + 1)

    END;


    CREATE TRIGGER incrementa_opere_museo
    AFTER INSERT ON “Opere”
    FOR EACH ROW EXECUTE PROCEDURE incrementa_opere_museo(idmuseo)



    Come faccio !?!?!?!

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    Nessuno pratico di trigger ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101

  4. #4
    Ciao.

    Le parole chiavi sono NEW e OLD nella sintassi del Trigger e l'espressione field_name = field_name + 1 (o meno 1).
    Cordiali Saluti, Santo Leto.

    Esegui:

    DROP DATABASE test_trigger;
    CREATE DATABASE test_trigger;
    USE test_trigger;

    CREATE TABLE `museo` (
    `id_museo` bigint(20) NOT NULL,
    `descrizione_museo` char(25) DEFAULT NULL,
    `numero_opere_contenute` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id_museo`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    CREATE TABLE `opere` (
    `id_opera` bigint(20) NOT NULL AUTO_INCREMENT,
    `autore_opera` char(50) DEFAULT NULL,
    `descrizione_opera` char(50) DEFAULT NULL,
    `id_museo` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id_opera`),
    KEY `id_opera` (`id_opera`)
    ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

    delimiter $$

    CREATE
    DEFINER = 'root'@'localhost'
    TRIGGER `test_trigger`.`aumenta_opere`
    AFTER INSERT ON `opere`
    FOR EACH ROW
    BEGIN
    UPDATE museo SET numero_opere_contenute = numero_opere_contenute + 1 WHERE id_museo= NEW.id_museo;
    END$$

    CREATE
    DEFINER = 'root'@'localhost'
    TRIGGER `test_trigger`.`diminuisci_opere`
    AFTER DELETE ON `opere`
    FOR EACH ROW
    BEGIN
    UPDATE museo SET numero_opere_contenute = numero_opere_contenute - 1 WHERE id_museo= OLD.id_museo;
    END$$

    delimiter ;

    INSERT INTO `test_trigger`.`museo` (`id_museo`, `descrizione_museo`, `numero_opere_contenute`) VALUES ('1','Museo1','0');
    INSERT INTO `test_trigger`.`museo` (`id_museo`, `descrizione_museo`, `numero_opere_contenute`) VALUES ('2','Museo2','0');
    INSERT INTO `test_trigger`.`museo` (`id_museo`, `descrizione_museo`, `numero_opere_contenute`) VALUES ('3','Museo3','0');


    Adesso prova:

    mysql> SELECT * FROM `test_trigger`.`museo`;
    +----------+-------------------+------------------------+
    | id_museo | descrizione_museo | numero_opere_contenute |
    +----------+-------------------+------------------------+
    | 1 | Museo1 | 0 |
    | 2 | Museo2 | 0 |
    | 3 | Museo3 | 0 |
    +----------+-------------------+------------------------+
    3 rows in set (0.00 sec)


    Adesso esegui:

    INSERT INTO `test_trigger`.`opere` (`id_opera`, `autore_opera`, `descrizione_opera`, `id_museo`) VALUES ('1','Autore1','Descrizione1','1');

    e verifica:

    mysql> SELECT * FROM `test_trigger`.`museo`;
    +----------+-------------------+------------------------+
    | id_museo | descrizione_museo | numero_opere_contenute |
    +----------+-------------------+------------------------+
    | 1 | Museo1 | 1 |
    | 2 | Museo2 | 0 |
    | 3 | Museo3 | 0 |
    +----------+-------------------+------------------------+
    3 rows in set (0.00 sec)


    Adesso esegui:

    DELETE FROM `test_trigger`.`opere` WHERE `id_opera`='1';

    e verfica:

    mysql> SELECT * FROM `test_trigger`.`museo`;
    +----------+-------------------+------------------------+
    | id_museo | descrizione_museo | numero_opere_contenute |
    +----------+-------------------+------------------------+
    | 1 | Museo1 | 0 |
    | 2 | Museo2 | 0 |
    | 3 | Museo3 | 0 |
    +----------+-------------------+------------------------+
    3 rows in set (0.00 sec)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    ti ringrazio mi hai salvato...grazie per le ampie spiegazioni anche ma quindi... non creo una funzione, metto l'incremento automaticamente dentro il trigger ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    con la mia sintassi io l'ho ricambiato in questo modo

    CREATE TRIGGER incrementa_opere_museo
    AFTER INSERT ON “Opera”
    FOR EACH ROW
    BEGIN
    UPDATE “Museo” SET numero_opere_presenti = numero_opere_presenti + 1 WHERE idmuseo= NEW.idmuseo;
    END$$


    e ho provato a inserirlo ma mi da questo errore


    Errore SQL:


    ERROR: syntax error at or near "BEGIN"
    LINE 4: BEGIN
    ^

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    dimenticavo... Uso postgreSql

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    Originariamente inviato da caiolo
    con la mia sintassi io l'ho ricambiato in questo modo

    CREATE TRIGGER incrementa_opere_museo
    AFTER INSERT ON “Opera”
    FOR EACH ROW
    BEGIN
    UPDATE “Museo” SET numero_opere_presenti = numero_opere_presenti + 1 WHERE idmuseo= NEW.idmuseo;
    END$$


    e ho provato a inserirlo ma mi da questo errore


    Errore SQL:


    ERROR: syntax error at or near "BEGIN"
    LINE 4: BEGIN
    ^

    non riesco a capire.... sarà per il linguaggio...?? non capisco che errore possa vedere dopo begin !

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    60
    dalla versione 5.0.2 dà errore se utilizzi BEGIN ... END con una sola operazione.
    Fai solamente:

    CREATE TRIGGER incrementa_opere_museo
    AFTER INSERT ON “Opera”
    FOR EACH ROW
    UPDATE “Museo” SET numero_opere_presenti = numero_opere_presenti + 1 WHERE idmuseo= NEW.idmuseo;

    qualcuno invece sa come potrei verificare se esiste un campo e in caso negativo crearlo e poi inserirci qualcosa?


    cioè qualcosa del tipo

    CREATE TRIGGER test
    AFTER INSERT ON 'test_1'
    FOR EACH ROW
    BEGIN
    IF ((SELECT 'month' FROM 'test_1' WHERE 'month' = '01' AND 'year' = 2008) != 0 )) THEN ...

    ELSE ...

    ENDIF...
    END;


    è possibile? grazie!

    ciao
    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.