2013-06-03 10 views
24

Próbuję napisać wyzwalacz, mam następujące tabele: BookingRequest:MySQL po wyzwalacz INSERT który aktualizuje kolumny innej tabeli za

+-----------+---------+------+-----+---------+----------------+ 
    | 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 |    | 
    +-----------+---------+------+-----+---------+----------------+ 

stół cywilny:

+------------+--------------------------------------------------+------+-----+---------+-------+ 
| 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 |    | 
+--------------+---------+------+-----+---------+----------------+ 

Potrzebuję spustu, który zmieni status w BookingReques na 1, jeśli wymaga tego st z tym samym identyfikatorem jest włożona do stołu OccupiedRoom, więc próbowałem coś takiego

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; 

i to nie działa, więc wszelkie sugestie będą bardzo appriciated

+0

usunięcie średnik po 'ustawić status = '1'' powinien zrobić to – mhafellner

Odpowiedz

25

Spróbuj tego:

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

tak, działa, wiele razy: D – DeadKennedy

1

Może usunąć średnik po zbiorze ponieważ teraz instrukcja where nie należy do instrukcji aktualizacji. Również idRequest może być problem, lepiej napisać BookingRequest.idRequest

+0

nie można zmieniać jego wartość w' AFTER' spuście. Ale nadal możesz go użyć do aktualizacji kolejnej tabeli. – user4035

19

z wymaganiami nie trzeba BEGIN END i IF z niepotrzebnym SELECT w spuście. Więc można uprościć do tego

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

cóż, tak, to jest o wiele bardziej jasne, thnx – DeadKennedy

+2

@DeadKennedy Dlaczego nie robisz tego jako akceptowanej odpowiedzi? Pomoże to innym spojrzeć na tę odpowiedź. – Prashanth

+0

Tak, to powinna być akceptowana odpowiedź, moim zdaniem. –

-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 ;