2015-06-20 113 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我更新了语法 –