任务是更新列klienta_nr
中的特定行,该列位于表klientu_ieteikumi
中。如果在klienti
表中删除了特定行。此代码更新整个列而不是特定行。有什么问题?
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();
答案 0 :(得分:2)
您需要WHERE
子句来限制受该语句影响的行数。
编辑:
UPDATE klientu_ieteikumi
SET klienta_nr = NULL
WHERE klienta_ieteikumi.klienta_nr = klienti.klienta_nr
答案 1 :(得分: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
子句中未绑定(完全没有意义)的表FROM
会导致CROSS JOIN
。即,UPDATE
执行的次数与klienti
中的行数相同,而不是一次。这将是对性能的主要拖累,而您可能永远不会发现,因为没有错误消息。您的服务器上浪费了很多周期和表格膨胀。