0

klienta_nr任务是更新位于表中的列中的特定行klientu_ieteikumiklienti如果在表中删除了特定行。此代码更新整列而不是特定行。问题是什么?

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();
4

2 回答 2

2

您需要一个WHERE子句来限制受语句影响的行数。

编辑:

UPDATE klientu_ieteikumi 
SET klienta_nr = NULL 
WHERE klienta_ieteikumi.klienta_nr = klienti.klienta_nr
于 2012-12-06T20:21:07.153 回答
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();
  • 触发器NEW中没有。AFTER这根本不起作用并立即引发异常。

  • 子句中未绑定(并且完全没有意义)klienti的表导致. 即,而不是仅仅一次,执行的次数与. 这将对性能造成重大拖累,而且您可能永远不会发现,因为没有错误消息。只是在您的服务器上浪费了大量的周期和表格膨胀。FROMCROSS JOINUPDATEklienti

于 2013-03-30T09:59:59.207 回答