在PostgreSQL的freeTicket函数中设置变量并用于INSERT的最优方法
简化版方案(适合无需严格校验的场景)
如果你的业务允许优惠券不存在时不插入任何记录,也可以省略变量声明,直接在INSERT的子查询中获取优惠券码,代码更简洁:
CREATE OR REPLACE FUNCTION freeTicket(eid integer NOT NULL) RETURNS void AS $$ BEGIN INSERT INTO purchases (cid, pdate, eid, ccode) SELECT p.cid, CURRENT_TIMESTAMP, $1, (SELECT code FROM couponCode WHERE eid = $1 AND percentage = 100 LIMIT 1) FROM purchase p GROUP BY p.cid HAVING COUNT(*) > 5 ORDER BY p.cid; END; $$ LANGUAGE plpgsql;
注意事项
- 如果没有找到对应优惠券,
ccode字段会被插入NULL,需要确认你的业务是否允许这种情况 - 必须加
LIMIT 1,避免子查询返回多条结果导致整个INSERT失败
内容的提问来源于stack exchange,提问作者mcgillian
相关产品推荐
相关产品推荐

