PostgreSQL插入时遇子查询返回多行错误,求解决方案
问题解决:子查询返回多行导致INSERT报错
错误原因
你SELECT列表里的(SELECT consent_id ...)子查询会返回多个符合条件的consent_id,但作为单个字段的表达式时,SQL只允许子查询返回1行结果,因此触发more than one row returned by a subquery used as an expression错误。
修正后的代码
要实现“为每个符合条件的consent_id创建一条新的状态记录”,应该把生成UUID的逻辑和子查询做关联查询,而不是把子查询放在字段位置:
INSERT INTO payment_consent_state ( id, consent_id, status, created_at ) SELECT -- 生成UUID的逻辑保持不变 uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring) as id, sub.consent_id, 'REJECTED' as status, now() as created_at FROM ( -- 原查询作为子查询,获取所有符合条件的consent_id SELECT consent_id FROM payment_consent_state WHERE created_at < current_timestamp - interval '185 minutes' GROUP BY consent_id HAVING COUNT(consent_id) = 1 ) AS sub;
逻辑说明
- 子查询
sub先筛选出所有满足条件的consent_id; - 主查询为每个consent_id生成一个唯一UUID,同时填充状态
REJECTED和当前时间作为created_at; - 最终会为每个符合条件的consent_id插入一条新的记录。
内容的提问来源于stack exchange,提问作者Joao Pedro
相关产品推荐
相关产品推荐

