PostgreSQL函数执行INSERT后无法返回ID问题求助
问题解决方法
你的函数存在两个关键问题导致插入后返回空ID:
- 错误递归调用函数自身:
SELECT id FROM save_data_if_not_found这行代码是在查询函数本身,而非你要操作的数据表,这会导致逻辑异常。 - 插入后未返回新生成的ID:当插入新数据时,你把ID存入了
save_id变量,但没有将这个变量返回,所以函数没有输出结果。
以下是修正后的完整函数代码:
CREATE OR REPLACE FUNCTION save_data_if_not_found( input_data1 character varying, input_data2 character varying, input_data3 integer) RETURNS integer -- 因为仅返回单个ID,用integer比SETOF integer更合适 LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ DECLARE save_id integer; BEGIN -- 从目标数据表查询(替换成你实际的表名,比如原表是data_table) SELECT id INTO save_id FROM data_table -- 这里必须是你的实际数据表名,不是函数名 WHERE data2 = input_data2 AND data3 = input_data3; IF NOT FOUND THEN RAISE INFO 'No id found. Create new'; INSERT INTO data_table (data1,data2,data3) VALUES (input_data1,input_data2,input_data3) RETURNING id INTO save_id; -- 返回新插入的ID RETURN save_id; ELSE RAISE INFO 'Id found.'; -- 返回已存在的ID RETURN save_id; END IF; END; $BODY$;
关键修改点:
- 将查询对象从函数
save_data_if_not_found改为实际的数据表(示例中用data_table,请替换成你的真实表名)。 - 调整返回类型为
integer(每次仅返回一个ID,无需使用SETOF integer)。 - 在
IF和ELSE分支中都添加RETURN save_id,确保无论查询到已有数据还是插入新数据,都能返回对应的ID。
调用函数时使用:
SELECT save_data_if_not_found ('john','doe',1);
内容的提问来源于stack exchange,提问作者Fendy
相关产品推荐
相关产品推荐

