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,更新特定行中的列,而不是所有行的主要内容,如果未能解决你的问题,请参考以下文章

更新表中所有行中的一列

SQL Server 在特定列的所有行中查找和替换特定单词

Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)

如何在sql server中获取更新的列名

pyspark:删除所有行中具有相同值的列

更新受组影响的所有行