【问题标题】:SQL, update column in a specific row, instead of all rowsSQL,更新特定行中的列,而不是所有行
【发布时间】: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();

【问题讨论】:

    标签: sql postgresql triggers sql-update plpgsql


    【解决方案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 中的行数一样多,而不是一次。这会严重拖累性能,并且您可能永远不会发现,因为没有错误消息。只是在您的服务器上浪费了很多周期和表格膨胀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2014-06-21
      • 2023-02-01
      • 2021-09-08
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多