2015-06-20 112 views
0

更新記錄我有三個表:PLSQL觸發 - 基於選擇查詢

HouseMode: 
mode_id (INT, PK) 
switch (CHAR 1BYTE) 

ModeDevices: 
modedevice_id (INT, PK) 
house_mode (INT, FK) 
houseroomdevice (INT, FK) 

HouseRoomDevices: 
houseroomdevice_id (INT, PK) 
switch (CHAR 1BYTE) 

我想有一個觸發器,它在HouseMode表更新開關之後從HouseRoomDevices表更新交換機。

我的觸發器:

CREATE OR REPLACE TRIGGER switch 
BEFORE UPDATE 
ON HouseMode 
FOR EACH ROW 
BEGIN 
    UPDATE houseroomdevices 
    SET switch = :NEW.switch 
    WHERE EXISTS(SELECT houseroomdevice_id FROM houseroomdevices INNER JOIN modedevices ON houseroomdevice = houseroomdevice_id WHERE house_mode = :NEW.mode_id); 
END; 

但是,當我嘗試更新的記錄:

UPDATE HouseMode 
SET switch = 1 
WHERE mode_id = 1; 

它從HouseRoomDevices表更新中的所有記錄。

+0

相信它應該是UPDATE ON HouseMode按你的說法 –

回答

1

您的更新語句錯誤,因爲您的WHERE條件始終爲真。使用這一個:

UPDATE houseroomdevices 
SET switch = :NEW.switch 
WHERE houseroomdevice_id IN (SELECT houseroomdevice FROM modedevices WHERE house_mode = :NEW.mode_id); 
+0

後拋出語法錯誤旁邊JOIN statment。 – Gregy

+0

Pavel,這是一個錯誤的語法。你將不得不使用子查詢來實現這一點。 – Rahul

+0

@gregy我更新了語法 –