2012-12-06 36 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中的行次数相同。这将成为性能的主要拖累,并且因为没有错误消息,您可能永远也找不到。在你的服务器上浪费很多周期和表格膨胀。

相关问题