Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [MySql] Aiutino con un trigger...è quasi finito ma mi sono bloccato

    Ho 2 tabelle aventi la seguente struttura:

    codice:
    mysql> describe feedbackVenditore;
    +---------------+--------------------------------------+------+-----+---------+-------+
    | Field         | Type                                 | Null | Key | Default | Extra |
    +---------------+--------------------------------------+------+-----+---------+-------+
    | Id_Oggetto    | int(11)                              | NO   | PRI | NULL    |       |
    | Id_Venditore  | varchar(20)                          | NO   |     | NULL    |       |
    | Id_Acquirente | varchar(20)                          | NO   |     | NULL    |       |
    | Feedback      | enum('Positivo','Neutro','Negativo') | NO   |     | NULL    |       |
    | Commento      | varchar(255)                         | YES  |     | NULL    |       |
    +---------------+--------------------------------------+------+-----+---------+-------+
    5 rows in set (0.26 sec)
    
    +---------------+--------------------------------------+------+-----+---------+-------+
    | Field         | Type                                 | Null | Key | Default | Extra |
    +---------------+--------------------------------------+------+-----+---------+-------+
    | Id_Oggetto    | int(11)                              | NO   | PRI | NULL    |       |
    | Id_Acquirente | varchar(20)                          | NO   |     | NULL    |       |
    | Id_Venditore  | varchar(20)                          | NO   |     | NULL    |       |
    | Feedback      | enum('Positivo','Neutro','Negativo') | NO   |     | NULL    |       |
    | Commento      | varchar(255)                         | YES  |     | NULL    |       |
    +---------------+--------------------------------------+------+-----+---------+-------+
    Praticamente voglio creare un trigger sulla tabella FeedbackAcquirente che fà la seguente cosa:
    Se provo ad inserire un record nella tabella FeedbackAcquirente controlla se nella tabella FeedbackVenditore è presente un record avendte il campo Id_Oggetto uguale al campo Id_Oggetto che stò tentando di inserire nella tabella FeedbackAcquirente.
    Se c'è allora il nuovo record viene inserito in FeedbackAcquirente, altrimenti non viene inserito (e magari fà comparire una scritta sul prompt di MySql...ma questa cosa è opzionale)

    Io ho iniziato a scrivere il codice ma ad un certo punto mi sono impallato:

    codice:
    DELIMITER $$
    
    CREATE TRIGGER Check_FeedBack_Trg
      BEFORE INSERT ON FeedbackAcquirente    /* Esegue il trigger prima dell'inserzione di un record in FeedbackAcquirente */
      FOR EACH ROW
    
    BEGIN
    
      DECLARE contatore INTEGER;            /* Dichiaro una variabile contatore intera */
    
      /* Mettre dentro contatore il numero di record presenti in FeedbackVenditore il cui campo Id_Oggetto ha lo stesso
         valore del campo Id_Oggetto del record che si stà tentando di inserire in FeedbackAcquirente */
    
      SELECT COUNT(*) INTO contatore FROM FeedbackVenditore WHERE NEW.Id_Oggetto = FeedBackVenditore.Id_Oggetto;
    
      /* Se il contatore è diverso da 1 vuol dire che non è stato ancora lasciato il feedback dal venditore percui lanciamo
      l'errore */
    
      IF contatore <> 1 THEN
      CALL Operazione_non_permessa()

    Praticamente se la condizione della IF è vera significa che il nuovo record non deve essere inserito nella tabella FeedbackAcquirente....ho messo una generica CALL Operazione_non_permessa() al posto della quale dovrei metterci la corretta istruzione per dirgli di non inserire il record...tranne che non ho la minima idea di quale sia e non riesco a trovarla sul manuale...qualcuno mi sà dare una manina?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di TeraBIT
    Registrato dal
    Dec 2005
    Messaggi
    178
    1) le tabelle che hai postato sono uguali tra loro

    2)
    Se provo ad inserire un record nella tabella FeedbackAcquirente controlla se nella tabella FeedbackVenditore è presente un record avendte il campo Id_Oggetto uguale al campo Id_Oggetto che stò tentando di inserire nella tabella FeedbackAcquirente.

    quello che hai descritto è un vincolo di chiave esterna, che vincola i valori di un attributo di una tabella figlia (acquirente) all'esistenza di quei valori nell'attributo della tabella padre(venditore), dette anche foreign key
    è troppo impegnativo...

  3. #3
    si le due tabelle sono uguali ma logicamente distinte per motivi di prestazioni.

    La prima raccoglie i feedback ricevuti dai venditori, la seconda i feedback ricevuti dagli acquirenti, questo perchè ogni tabella conterrà circa mezzo milione di record e se i dati fossero messi in un'unica tabella oltre ad avere un milione di record circa dovrei aggiungere un campo enum che discrimina se il feedbacl è relativo ad un acquisto o ad una vendita...avrei tanti più dati e nelle query una condizione WHERE in più...quindi le performance calerebbero sensibilmente...

    Quindi secondo te basta che inserisco una foregign key sul campo Id_Oggetto di Id_Acquirente?

    Non si potrebbe fare ancoe con i trigger? (più che altro è un progetto per un esame e devo far vedere che sò usare i trigger in qualche modo hehe)

    Grazie
    Andrea

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.