2013-06-03 36 views
24

tôi đang cố gắng để viết một kích hoạt của bảng khác, tôi đã bàn sau: BookingRequest:mysql sau khi chèn kích hoạt mà cập nhật cột

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

bảng trạng thái:

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

tôi cần trình kích hoạt sẽ thay đổi trạng thái trong BookingReques thành 1 nếu reque st với cùng id được chèn vào bảng OccupiedRoom, vì vậy tôi đã cố gắng một cái gì đó như thế này

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; 

và nó không hoạt động, vì vậy bất cứ đề nghị sẽ được rất appriciated

+0

loại bỏ các dấu chấm phẩy sau 'tình trạng set =' 1'' nên làm điều đó – mhafellner

Trả lời

25

Hãy thử điều này:

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

vâng, nó hoạt động, nhiều thnx: D – DeadKennedy

1

Có lẽ loại bỏ các dấu chấm phẩy sau bộ bởi vì bây giờ câu lệnh where không thuộc về câu lệnh cập nhật. Ngoài ra idRequest có thể là một vấn đề, tốt hơn viết BookingRequest.idRequest

+0

Bạn không thể thay đổi giá trị của nó trong 'AFTER' cò. Nhưng bạn vẫn có thể sử dụng nó để cập nhật một bảng khác. – user4035

19

Với yêu cầu của bạn, bạn không cần BEGIN ENDIF với không cần thiết SELECT trong kích hoạt của bạn. Vì vậy, bạn có thể đơn giản hóa nó để này

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

vâng, nó rõ ràng hơn nhiều, thnx – DeadKennedy

+2

@DeadKennedy Tại sao bạn không làm cho nó như là câu trả lời được chấp nhận? Nó sẽ giúp người khác nhìn vào câu trả lời này. – Prashanth

+0

Yup, đây là câu trả lời được chấp nhận, theo ý kiến ​​của tôi. –

-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 ; 
Các vấn đề liên quan