SQL,更新特定行中的列,而不是所有行
Posted
技术标签:
【中文标题】SQL,更新特定行中的列,而不是所有行【英文标题】:SQL, update column in a specific row, instead of all rows 【发布时间】:2012-12-06 20:19:56 【问题描述】:任务是更新列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();
【问题讨论】:
【参考方案1】:您需要一个WHERE
子句来限制受语句影响的行数。
编辑:
UPDATE klientu_ieteikumi
SET klienta_nr = NULL
WHERE klienta_ieteikumi.klienta_nr = klienti.klienta_nr
【讨论】:
可以在哪里 klienta_ieteikumi.klienta_nr = klienti.klienta_nr;工作吗? 我有很多猜测 - 这看起来很有希望。 好的,但是我应该把它放在哪里?【参考方案2】:您提出的“解决方案”不起作用并且是偷偷摸摸的错误。
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
触发器中没有 NEW
。这根本不起作用并立即引发异常。
FROM
子句中的未绑定(并且完全没有意义)表klienti
导致CROSS JOIN
。也就是说,UPDATE
的执行次数与klienti
中的行数一样多,而不是一次。这会严重拖累性能,并且您可能永远不会发现,因为没有错误消息。只是在您的服务器上浪费了很多周期和表格膨胀。
【讨论】:
以上是关于SQL,更新特定行中的列,而不是所有行的主要内容,如果未能解决你的问题,请参考以下文章