尝试创建一个更新一个表的函数,并使用psql从另一个表中删除数据

时间:2012-05-14 07:16:09

标签: sql function subquery

我正在为我的班级开发一个项目,我们被告知要创建一个删除与特定购物车号码相关的数据并更新产品表的功能。该功能只有一个输入,即购物车编号。这就是我所拥有的:

create function clear_cart(text) returns void as
$$

  update products
     set qtyonhand = qtyonhand + (select qty from cart where cart_id = $1)
  where id in (select product_id from cart where cart_id = $1);

  delete from cart where cart_id = $1;

$$ language sql;

我一直在测试查询,直接将它们放入psql中,而我似乎无法解决的错误是:

set qtyonhand = qtyonhand + (select qty from cart where cart_id = $1)

它将多个值返回到只接受一个的字段。我试过去别处寻找,但我不确定在哪里可以找到类似于我想要做的子查询。任何帮助将不胜感激。

以防万一,这是项目所说的内容:

参数:cart_id char

返回:无

描述:从指定的购物车中删除所有商品。适当调整产品的库存量。

2 个答案:

答案 0 :(得分:2)

你没有向我们展示你的数据模型,但是从你给出的陈述中,我假设你想要这样的东西:

update products
   set qtyonhand = qtyonhand + t.qty
from (select product_id, 
             qty 
      from cart 
      where cart_id = $1) t
where products.id = t.product_id;

这假设cart表仅为每个产品保留一行。如果不是这种情况,那么“子选择也会返回多行”。

在这种情况下,您需要应用聚合函数:

update products
   set qtyonhand = qtyonhand + t.total_qty
from (select product_id, 
             sum(qty) as total_qty
      from cart 
      where cart_id = $1
      group by product_id) t
where products.id = t.product_id;

答案 1 :(得分:0)

您可以通过使用表中声明的ON UPDATE CASCADE之类的UPDATE语句来完成此操作。

所以如果你在名为child的表中声明了这个。 Fk是对父表的引用,当父表更新时,它会删除子表中的行。

FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE