2013-06-03 15 views
24

sto cercando di scrivere un trigger, ho seguito le tabelle: BookingRequest:mysql dopo il trigger di inserimento che aggiorna la colonna di un'altra tabella

+-----------+---------+------+-----+---------+----------------+ 
    | Field  | Type | Null | Key | Default | Extra   | 
    +-----------+---------+------+-----+---------+----------------+ 
    | idRequest | int(11) | NO | PRI | NULL | auto_increment | 
    | roomClass | int(11) | NO |  | NULL |    | 
    | inDate | date | NO |  | NULL |    | 
    | outDate | date | NO |  | NULL |    | 
    | numOfBeds | int(11) | NO |  | NULL |    | 
    | status | int(11) | NO | MUL | NULL |    | 
    | idUser | int(11) | NO | MUL | NULL |    | 
    +-----------+---------+------+-----+---------+----------------+ 

tabella di stato:

+------------+--------------------------------------------------+------+-----+---------+-------+ 
| Field  | Type            | Null | Key | Default | Extra | 
+------------+--------------------------------------------------+------+-----+---------+-------+ 
| idStatus | int(11)           | NO | PRI | NULL |  | 
| nameStatus | enum('underConsideration','approved','rejected') | YES |  | NULL |  | 
+------------+--------------------------------------------------+------+-----+---------+-------+ 

OccupiedRoom:

+--------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+--------------+---------+------+-----+---------+----------------+ 
| idOccupation | int(11) | NO | PRI | NULL | auto_increment | 
| idRoom  | int(11) | NO |  | NULL |    | 
| idRequest | int(11) | NO |  | NULL |    | 
+--------------+---------+------+-----+---------+----------------+ 

ho bisogno di un trigger che cambierà lo stato in BookingReques a 1 se richiesta st con lo stesso ID è inserito nella tabella OccupiedRoom, così ho provato qualcosa di simile

create trigger occupy_trig after insert on OccupiedRoom 
for each row 
begin 
    if BookingRequest.idRequest= NEW.idRequest 
    then 
     update BookingRequest 
     set status = '1'; 
     where idRequest = NEW.idRequest; 

    end if; 
END; 

e non funziona, quindi qualche suggerimento sarebbe molto appriciated

+0

rimuovere il punto e virgola dopo 'stato impostato = '1'' dovrebbe farlo – mhafellner

risposta

25

Prova questa:

DELIMITER $$ 
CREATE TRIGGER occupy_trig 
AFTER INSERT ON `OccupiedRoom` FOR EACH ROW 
begin 
     DECLARE id_exists Boolean; 
     -- Check BookingRequest table 
     SELECT 1 
     INTO @id_exists 
     FROM BookingRequest 
     WHERE BookingRequest.idRequest= NEW.idRequest; 

     IF @id_exists = 1 
     THEN 
      UPDATE BookingRequest 
      SET status = '1' 
      WHERE idRequest = NEW.idRequest; 
     END IF; 
END; 
$$ 
DELIMITER ; 
+0

sì, funziona, molti thnx: D – DeadKennedy

1

Forse rimuovere il punto e virgola dopo il set perché ora l'istruzione where non appartiene all'istruzione update. Anche il idRequest potrebbe essere un problema, meglio scrivere BookingRequest.idRequest

+0

Non è possibile modificare il suo valore in' AFTER' grilletto. Ma puoi ancora usarlo per aggiornare un altro tavolo. – user4035

19

con le vostre esigenze non è necessario BEGIN END e IF con inutili SELECT nel vostro grilletto. Così si può semplificare in questo

CREATE TRIGGER occupy_trig AFTER INSERT ON occupiedroom 
FOR EACH ROW 
    UPDATE BookingRequest 
    SET status = 1 
    WHERE idRequest = NEW.idRequest; 
+0

beh sì, è molto più chiaro, thnx – DeadKennedy

+2

@DeadKennedy Perché non lo fai come risposta accettata? Aiuterà gli altri a guardare questa risposta. – Prashanth

+0

Sì, questa dovrebbe essere la risposta accettata, secondo me. –

-2
DELIMITER // 

CREATE TRIGGER contacts_after_insert 
AFTER INSERT 
    ON contacts FOR EACH ROW 

BEGIN 

    DECLARE vUser varchar(50); 

    -- Find username of person performing the INSERT into table 
    SELECT USER() INTO vUser; 

    -- Insert record into audit table 
    INSERT INTO contacts_audit 
    (contact_id, 
    deleted_date, 
    deleted_by) 
    VALUES 
    (NEW.contact_id, 
    SYSDATE(), 
    vUser); 

END; // 

DELIMITER ; 
Problemi correlati