如何在PL/pgSQL中编写带数组列条件判断的upvote投票函数?
正确实现的upvote函数
你原有伪代码的核心逻辑可以直接调整为合法的PostgreSQL PL/pgSQL语法,核心修正点如下:
- 重命名输入参数为
p_cid、p_uid,避免和表中同名字段产生歧义,原写法where cid = cid会永远成立,导致误更新全表 - 使用
NOT p_uid = ANY(already_voted_uids)实现「uid未存在于已投票数组」的判断 - 使用PostgreSQL内置的
array_append()函数实现数组追加元素的操作 - 将票数加1、数组追加uid的操作合并到同一条UPDATE语句中,保证操作原子性
完整可运行代码如下:
create function upvote (p_cid text, p_uid uuid) returns void as $$ begin update submissions set number_of_votes = number_of_votes + 1, already_voted_uids = array_append(already_voted_uids, p_uid) where cid = p_cid and NOT p_uid = ANY(already_voted_uids); end; $$ language plpgsql security definer;
注意:请提前为submissions表的already_voted_uids列设置默认值为'{}'::uuid[],避免字段为NULL时判断逻辑失效、元素追加失败。
内容的提问来源于stack exchange,提问作者KevinTale
相关产品推荐
相关产品推荐

