调用含RETURNING的PostgreSQL函数时出现'id'列引用歧义错误
问题原因
错误column reference "id" is ambiguous的本质是:函数的RETURNS TABLE定义了与driver_orders表完全同名的列(id、location_from、location_to),在RETURN QUERY INSERT ... RETURNING语句中,PostgreSQL无法判断你引用的是函数返回表的列,还是原表的列,从而触发歧义错误。
解决方案
给driver_orders表添加别名,在RETURNING子句中明确指定原表别名的列,消除歧义。修改后的函数核心代码如下:
-- 4. 创建订单 RETURN QUERY INSERT INTO driver_orders do ( car_id, start_point, end_point ) VALUES ( car_id, s_point, e_point ) RETURNING do.id, do.location_from, do.location_to;
也可以选择给函数返回表的列重命名,同时在RETURNING子句中做别名映射,示例如下:
CREATE OR REPLACE FUNCTION create_driver_order( car_id INTEGER, s_point VARCHAR, e_point VARCHAR ) -- 修改返回列名 RETURNS TABLE ( order_id INTEGER, loc_from GEOGRAPHY, loc_to GEOGRAPHY ) LANGUAGE plpgsql AS $$ DECLARE active_order_count INTEGER; BEGIN -- 省略其他逻辑 RETURN QUERY INSERT INTO driver_orders ( car_id, start_point, end_point ) VALUES ( car_id, s_point, e_point ) -- 映射返回列 RETURNING id AS order_id, location_from AS loc_from, location_to AS loc_to; END; $$
内容的提问来源于stack exchange,提问作者ABDULLOKH MUKHAMMADJONOV
相关产品推荐
相关产品推荐

