【发布时间】:2021-12-16 16:40:00
【问题描述】:
我在 PostgreSQL 中有一个经典的 cart items 表。
我想要什么:
当我执行插入时,我想防止插入新的重复记录,而是更新现有记录的数量字段。
在插入前尝试过触发函数和触发:
CREATE OR REPLACE FUNCTION ecommerce.add_store_cart_item()
RETURNS trigger
LANGUAGE 'plpgsql'
VOLATILE
COST 100
AS $BODY$
begin
insert into ecommerce.store_cart_item
(item_id, user_id)
values
(NEW.item_id, NEW.user_id)
on conflict (item_id, user_id) DO UPDATE
SET qty = EXCLUDED.qty + NEW.qty;
return NULL;
end;
$BODY$;
但我在这里得到递归。
也尝试了规则,但它也不起作用:
CREATE OR REPLACE RULE check_store_cart_item_duplicates AS
ON INSERT TO ecommerce.store_cart_item
WHERE (EXISTS ( SELECT 1
FROM ecommerce.store_cart_item store_cart_item_1
WHERE ((store_cart_item_1.item_id = new.item_id) AND (store_cart_item_1.user_id = new.user_id))))
DO INSTEAD
(UPDATE ecommerce.store_cart_item SET qty = (store_cart_item.qty + new.qty)
WHERE ((store_cart_item.user_id = new.user_id) AND (store_cart_item.item_id = new.item_id)));
注意
我不想使用简单的INSERT ... ON CONFLICT 命令,因为我希望它在数据库级别进行完整性检查(这种方法实际上将其移至应用程序级别)。
我想知道最有效最正确的方法。
【问题讨论】:
标签: sql postgresql triggers