2013-06-03 4 views
24

Ich versuche, einen Auslöser zu schreiben, ich habe folgende Tabellen: Buchungsanfrage:mysql nach Insert-Trigger, die eine andere Tabelle die Spalte aktualisiert

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

Statustabelle:

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

Ich brauche einen Trigger, der den Status in BookingReques auf 1 ändern wird, wenn es reque st mit derselben ID in OccupiedRoom Tabelle eingefügt, so habe ich versucht, so etwas wie dieses

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; 

und es funktioniert nicht, so würden alle Vorschläge sehr appriciated

+0

das Semikolon entfernen, nachdem 'set status = '1'' sollte es tun – mhafellner

Antwort

25

Try this:

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

yeah, es funktioniert, viele thnx: D – DeadKennedy

1

Vielleicht machen Sie das Semikolon nach Satz entfernen Denn jetzt gehört die where-Anweisung nicht zur update-Anweisung. Auch die idRequest könnte ein Problem sein, besser schreiben BookingRequest.idRequest

+0

Sie können nicht, dass es Wert ändern in' AFTER' Trigger. Sie können es jedoch weiterhin verwenden, um eine andere Tabelle zu aktualisieren. – user4035

19

mit Ihren Anforderungen, die Sie nicht brauchen BEGIN END und IF mit unnötigen SELECT in Ihrem Trigger. So kann man es auf diese vereinfachen

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

na ja, es ist viel klarer, thnx – DeadKennedy

+2

@DeadKennedy Warum machst du es nicht als die akzeptierte Antwort? Es wird anderen helfen, diese Antwort zu sehen. – Prashanth

+0

Yup, das sollte meiner Meinung nach die akzeptierte Antwort sein. –

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