gpt4 book ai didi

sql - postgres 中的触发器

转载 作者:行者123 更新时间:2023-11-29 12:14:26 25 4
gpt4 key购买 nike

我在 PL/pgSQL 中为 PostgreSQL 编写了一个简单的触发器,但它没有像我计划的那样工作。我有两个问题:

  1. 是否有针对 PostgreSQL 函数的调试器?
  2. 我哪里错了?我需要在这里检查 idprod

CREATE OR REPLACE FUNCTION add_towh() RETURNS TRIGGER AS $$
DECLARE
idsupp integer;
idprod integer;
whamount integer;
BEGIN

SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
SELECT ID INTO idprod from PRODUCTS where ID = idsupp;

if (idprod > 0) then
select amount into whamount from warehouses where product = idprod;
update warehouses set amount = whamount * new.amount;
else
insert into warehouses (product,amount) values(idprod, new.amount);
end if;
RETURN NEW;
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addtowh
AFTER INSERT ON orders FOR EACH ROW EXECUTE PROCEDURE add_towh ();

最佳答案

你的 if (idprod > 0)最好写成 if idprod is not null但是idprod > 0应该可以。

我猜错误就在这里:

update warehouses set amount = whamount * new.amount;

您在该 UPDATE 上没有 WHERE 子句,因此您将更改表中的每一行。您可以改用它:

select amount into whamount from warehouses where product = idprod;
update warehouses set amount = whamount * new.amount where product = idprod;

或者更好的是,通过一次更新完成:

update warehouses set amount = amount * new.amount where product = idprod;

如果你选择后者,那么你就不需要 whamount在您的 DECLARE 部分中。

此外,我认为您可以将前两个 SELECT 替换为一个 SELECT。这两个:

SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
SELECT ID INTO idprod from PRODUCTS where ID = idsupp;

可以用这个代替:

select p.id into idprod
from products p
join suppliers s on p.id = s.product
where s.id = new.supplier;

然后你就不需要idsupp了要么。

就调试而言,我唯一知道的是 printf使用 raise notice 进行调试;例如:

raise notice 'idprod is "%"', idprod;

关于sql - postgres 中的触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com