2014-10-11 61 views
0

我正在使用觸發器和函數將值插入到另一個表中。Postgresql錯誤當我使用觸發器時,子查詢返回多個行

我有此表 1)展

exhid exhname    description strtdate  enddate status 
101  The Famous   BLAH BLAH  2013-07-15 2013-10-13 SOON 
102  York Exhibition  BLAH BLAH  2013-08-07 2014-01-19 End 
103  Fine ART   BLAH BLAH  2014-09-26 2015-03-21 SOON 

2)Works_Exhibitions

alphid numberid  exhid 
    SCFI 1007   101 
    SCBU 1008   101 
    PAHF 1002   103 
    PAHE 1003   103 
    PASP 1004   103 

和第三具有它Temp_works_exhibitions

alphid numberid  exhid 
相同的屬性Works_Exhibitions和名字空表

我確實創建了此功能並觸發所以一旦我更新展覽中任何展覽的狀態爲「結束」,我想將該展覽的所有作品複製到新表格Temp_works_exhibitions中,然後從Works_exhibition表中刪除它

CREATE OR REPLACE FUNCTION add2Temp_works_exhibitions() returns TRIGGER AS $updExhibStat$ 
BEGIN 

IF(NEW.Status = 'End') THEN 
INSERT INTO temp_works_exhibitions 
select 

    Works_Exhibitions.alphID, 
    Works_Exhibitions.numberID, 
    Works_Exhibitions.exhID 

from 
    Works_Exhibitions 
where 
    Works_Exhibitions.exhID = (select Exhibitions.exhID from Exhibitions where Exhibitions.Status = 'End'); 

delete from Works_Exhibitions where Works_Exhibitions.exhID = (select Exhibitions.exhID from Exhibitions where Exhibitions.Status = 'End'); 

RETURN NEW; 
END IF; 
RETURN NULL; 
END; 

$updExhibStat$ LANGUAGE plpgsql; 

--CREATE TRIGGER updExhibStat AFTER UPDATE ON Exhibitions FOR EACH ROW EXECUTE PROCEDURE add2Temp_works_exhibitions(); 

當我測試它第一次做工作,但是當我試圖更新一個新的展覽我得到這個錯誤

ERROR: more than one row returned by a subquery used as an expression 
CONTEXT: SQL statement "INSERT INTO temp_works_exhibitions 
select 

    Works_Exhibitions.alphID, 
    Works_Exhibitions.numberID, 
    Works_Exhibitions.exhID 

from 
    Works_Exhibitions 
where 
    Works_Exhibitions.exhID = (select Exhibitions.exhID from Exhibitions where Exhibitions.Status = 'End')" 
PL/pgSQL function add2temp_works_exhibitions() line 5 at SQL statement 

任何想法如何解決這個問題

+0

瑣碎的方法是添加'LIMIT 1'但更大的問題是:您爲什麼認爲子查詢會返回一個答案?和/或如果沒有完全一個答案,你想要做什麼。 – 2014-10-11 23:05:20

+0

簡而言之:使用'EXISTS(...)' – wildplasser 2014-10-11 23:20:15

+0

我確實使用了EXISTS(...),但我得到的函數exisit(boolean)不存在 – Alex 2014-10-12 00:29:43

回答

0

我想我沒有解決這個問題

我沒有在函數的末尾添加此命令

UPDATE Exhibitions set Status = 'Expired' where Exhibitions.Status = 'End'; 

我想這不是一個真正的好設計,但我沒有其他的解決方案

相關問題