我在 PostgreSQL 中有一個經典的購物車專案表。
我想要的是:
當我執行插入時,我想防止插入新的重復記錄,而是更新現有記錄的數量欄位。
在插入之前嘗試觸發功能和觸發:
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命令,因為我希望它在資料庫級別進行完整性檢查(這種方法實際上將它移到了應用程式級別)。
我想知道最有效和正確的方法。
uj5u.com熱心網友回復:
法律是為人民服務的,而不是相反。
如果您在資料庫中對此進行編碼的規則使您無法使用最佳和最有效的解決方案 ( INSERT ... ON CONFLICT),請在這種情況下忽略該規則。不要讓指南妨礙一個簡單而好的解決方案。
uj5u.com熱心網友回復:
在觸發器內使用UPDATE陳述句而不是您的INSERT陳述句。將觸發器設定為INSERT僅在s上觸發。
例如
UPDATE ecommerce.store_cart_item
SET qty = qty 1
WHERE user_id = NEW.user_id AND item_id = NEW.item_id;
RETURN NULL; /* Stop the INSERT */
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/344798.html
標籤:sql PostgreSQL 触发器
上一篇:Django:如何在Postgresql中對日語(多位元組字串)進行全文搜索
下一篇:擁有1個以上設備組的用戶
