SQL,更新特定行中的列,而不是所有行

时间:2012-12-06 20:19:56

标签: sql postgresql triggers sql-update plpgsql

任务是更新列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();

2 个答案:

答案 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中的行数相同,而不是一次。这将是对性能的主要拖累,而您可能永远不会发现,因为没有错误消息。您的服务器上浪费了很多周期和表格膨胀。