2012-12-06 72 views
0

任務是更新列表klienta_nr中的特定行,該列位於表klientu_ieteikumi中。如果在klienti表中刪除了特定的行。此代碼更新整列而不是特定的行。問題是什麼?SQL,更新特定行中的列而不是所有行

CREATE FUNCTION "funkc"() RETURNS "opaque" AS ' 
DECLARE 
BEGIN 

IF (TG_OP = ''DELETE'') THEN 
UPDATE klientu_ieteikumi SET klienta_nr = NULL ; 
END IF; 
RETURN NEW; 
END; 
' LANGUAGE 'plpgsql'; 

CREATE TRIGGER "triger" 
AFTER DELETE ON "klienti" 
FOR EACH ROW EXECUTE PROCEDURE funkc(); 

這個人做了什麼,我想,反正感謝大家:)

CREATE FUNCTION "funkcija1"() RETURNS TRIGGER AS $$ 

BEGIN 

UPDATE klientu_ieteikumi SET klienta_nr = NULL 
FROM klienti WHERE old.klienta_nr = klientu_ieteikumi.klienta_nr; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER "trigeris" 
AFTER DELETE ON "klienti" 
FOR EACH ROW EXECUTE PROCEDURE funkcija1(); 

回答

2

你需要一個WHERE子句限制受該語句影響的行數。

編輯:

UPDATE klientu_ieteikumi 
SET klienta_nr = NULL 
WHERE klienta_ieteikumi.klienta_nr = klienti.klienta_nr 
+0

可能在哪裏klienta_ieteikumi.klienta_nr = klienti.klienta_nr;工作? –

+1

我有很多猜測 - 看起來很有希望。 – Randy

+0

好的,但我應該在哪裏放? –

0

您提出的 「解決方案」 不能工作,是錯誤偷偷摸摸

CREATE FUNCTION funkcija1() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 

CREATE FUNCTION funkcija1() 
    RETURNS TRIGGER AS 
$func$ 
BEGIN 

UPDATE klientu_ieteikumi 
SET klienta_nr = NULL 

             
  
    FROM klienti 
   -- !! 
WHERE klientu_ieteikumi.klienta_nr = OLD.klienta_nr; 


             
  
    RETURN NEW; 
   
RETURN NULL; 

END 
$func$ LANGUAGE plpgsql; 


CREATE TRIGGER trigeris 
AFTER DELETE ON klienti 
FOR EACH ROW EXECUTE PROCEDURE funkcija1();
  • 有在AFTER觸發沒有NEW。這根本行不通,立即引發異常。

  • FROM子句中的未綁定(並且完全沒有意義)表klienti導致CROSS JOIN。即,而不是一次,UPDATE執行的次數與klienti中的行次數相同。這將成爲性能的主要拖累,並且因爲沒有錯誤消息,您可能永遠也找不到。在你的服務器上浪費很多週期和表格膨脹。

相關問題