1

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

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 字符

回报:无

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

4

2 回答 2

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;
于 2012-05-14T07:50:43.500 回答
0

您可以通过使用表中声明的类似 ON UPDATE CASCADE 之类的内容,仅使用 UPDATE 语句来执行此操作。

因此,如果您在名为 child 的表中声明了它。Fk 是对父表的引用,当父表更新时,它会删除子表中的行。

FOREIGN KEY (parent_id)
        REFERENCES parent(id)
        ON UPDATE CASCADE
于 2012-05-14T07:33:31.393 回答