pgsql游标批量插入数据,id基于最大值自增:TaoToken统一Key接入配置与验证
发布时间:2026/9/26 12:26:34来源:尧图网络
1. 从一次配置表批量初始化说起pgsql 游标批量插入数据、id 基于最大值自增这个组合在真实项目里出现频率比想象中高。典型场景是你有一张comm.config配置表主键config_id没有用 sequence而是靠SELECT max(config_id) 1手动维护现在要给几十上百个机构comm.hospital各插一条同名配置于是写了个 plpgsql 函数用游标遍历机构列表逐条判断是否存在、不存在就插入。这个写法能跑但坑不少游标循环里每次max(config_id)1都重新扫表批量插入时 id 可能重复函数返回refcursor但调用方没正确 fetch再加上现在很多团队用 AI 编码工具Claude Code、Cursor、Cline 等来生成和调试这类 SQL工具链的 Key 管理又成了新问题——每个工具配一套 Key额度、模型、日志全散着。这篇就围绕这条链路先把游标批量插入 最大值自增的 SQL 写稳再把 AI 工具统一接到 TaoToken 的 Key/API 通道上最后给出验证 SQL 和自增 id 校验动作。适合正在做数据初始化、又想让 AI 工具稳定调用数据库脚本的后端同学。2. TaoToken 统一 Key 前置准备在讲配置之前先说清楚 TaoToken 在这里扮演什么角色。它提供统一的 API 通道和 Key 管理你可以在一个控制台里创建 Key、切换模型、查看调用记录然后把这个 Key 填到 Claude Code、Cursor、Cline 这类工具的配置里。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你需要先做两件事第一登录控制台创建 API Key。地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在 API Keys 页面新建一个复制出来形如sk-xxxx的字符串。这个 Key 就是后面所有工具共用的凭证。第二确认你要用的模型和通道。如果你主要做长期编码和 Agent 任务建议直接看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 它按编码场景做了额度规划比单次调用更划算。想先验证模型对话效果可以用模型对话页https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。注意Key 只创建一次、多处复用不要每个工具各建一个否则后面排查调用问题时很难定位是哪个工具超的额度。3. 可复制的 config.toml / settings.json 骨架不同 AI 工具读的配置文件不一样。下面给两份骨架你按自己用的工具挑一份改。核心就是把 base_url 指向 TaoToken 的 API 地址把 api_key 换成你刚创建的那串。先看 Claude Code 常用的~/.claude/settings.json骨架{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [Bash(psql:*)] } }这里ANTHROPIC_BASE_URL指向 TaoToken 的 API 基址ANTHROPIC_API_KEY填你的 Key。permissions.allow里放行psql命令是为了让工具能直接帮你跑验证 SQL不用每次手动确认。Claude Code 的接入细节可以对照文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。再看通用型工具的config.toml骨架很多 CLI 工具用这个格式[provider] name taotoken base_url https://taotoken.net/api api_key sk-你的Key model claude-sonnet-4-20250514 timeout 120 [provider.headers] Content-Type application/json两份配置的共同点base_url 不带任何多余路径api_key 用同一串model 按你控制台里可用的填。改完保存重启工具让配置生效。4. 游标批量插入 最大值自增的完整函数配置搞定后回到 SQL 本身。原始函数的问题在于max(config_id)1在循环里每次都重算而且c_id_plus从 1 开始累加逻辑上想表达「第 n 条就 n」但一旦中间有并发插入或已存在记录被跳过id 就会错位。更稳的写法是进循环前先取一次当前最大 id 作为基准循环里用基准递增同时用ON CONFLICT或存在性判断兜底。下面这版可以直接复制CREATE OR REPLACE FUNCTION bach_save_config( c_code text, c_name text, c_type text, c_value text, c_business_type_name text, c_memo text ) RETURNS void AS $BODY$ DECLARE c_org_id int8; orgid_list refcursor; base_id int8; c_id_plus int8 DEFAULT 0; isexist int8; BEGIN -- 一次性取当前最大 config_id 作为基准 SELECT COALESCE(max(config_id), 0) INTO base_id FROM comm.config; OPEN orgid_list FOR SELECT his_org_id FROM comm.hospital GROUP BY his_org_id; LOOP FETCH orgid_list INTO c_org_id; EXIT WHEN NOT FOUND; SELECT config_id INTO isexist FROM comm.config WHERE config_code c_code AND his_org_id c_org_id LIMIT 1; IF isexist IS NULL THEN c_id_plus : c_id_plus 1; INSERT INTO comm.config( config_id, business_type_id, config_code, config_name, display_flag, maintain_flag, config_type, input_code, full_code, precondition, memo, sort_order, version, config_value, his_org_id, his_creater_id, his_creater_name, his_create_time, his_updater_id, his_update_time ) VALUES ( base_id c_id_plus, (SELECT business_type_id FROM comm.business_type WHERE business_type_name c_business_type_name LIMIT 1), c_code, c_name, 1, 0, c_type, NULL, NULL, NULL, c_memo, 1, 0, c_value, c_org_id, -1, 系统管理员, now(), -1, now() ); ELSE RAISE NOTICE 配置编码已存在, org_id%, code%, c_org_id, c_code; END IF; END LOOP; CLOSE orgid_list; RAISE NOTICE 配置插入完毕, 共新增 % 条, c_id_plus; EXCEPTION WHEN OTHERS THEN RAISE EXCEPTION error--(%), sqlerrm; END; $BODY$ LANGUAGE plpgsql;关键改动有三处。一是base_id在循环外取一次避免循环内反复扫表。二是c_id_plus从 0 开始只有真正插入时才 1这样 id 连续且不会因为跳过已存在记录而跳号。三是返回类型从refcursor改成void因为原函数返回游标但调用方没 fetch反而容易误用如果你确实需要返回结果集再单独开一个查询函数。调用方式SELECT bach_save_config(CFG_001, 超时配置, int, 30, 系统参数, 默认超时30秒);5. 验证请求与自增 id 校验动作函数跑完别急着收工用下面几条 SQL 验证结果。先看插了多少条、id 是否连续-- 查看本次插入的配置 SELECT config_id, config_code, his_org_id, config_value FROM comm.config WHERE config_code CFG_001 ORDER BY config_id; -- 校验 id 是否有重复 SELECT config_id, COUNT(*) FROM comm.config GROUP BY config_id HAVING COUNT(*) 1; -- 校验 id 是否等于当前最大值区间 SELECT max(config_id) AS max_id, COUNT(*) AS total FROM comm.config;第一条应该返回每个机构一行config_id递增。第二条如果返回空说明没有重复 id自增逻辑成立。第三条的max_id应该等于插入前的基准值加上新增条数。如果你用 AI 工具来跑这些验证可以在对话里直接说「帮我执行上面三条 SQL 并解释结果」工具会通过你配好的 TaoToken 通道调用模型再走psql执行。想单独验证模型对话是否通去 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 试一句即可。6. 本篇常见错排查报错一column config_id does not exist或类型不匹配。多半是base_id声明成了 int4而config_id是 int8。把base_id int8和c_id_plus int8都确认成 int8COALESCE(max(config_id), 0)的 0 也会被隐式转成 int8。报错二cursor orgid_list already in use。说明上一次调用没正常 close或者函数被并发调用。检查 EXCEPTION 块里是否漏了 close必要时在异常处理里补CLOSE orgid_list。更彻底的做法是改用FOR rec IN SELECT ... LOOP的隐式游标省去手动 open/fetch/close。报错三id 重复。如果表上没有唯一约束并发插入时两个会话可能取到同一个base_id。解决办法是给config_id加主键或唯一索引让数据库帮你兜底或者改用 sequence从根上避免手动 max。手动 max 方案只适合单会话、低并发的初始化场景。报错四AI 工具报 401 或连接失败。先确认ANTHROPIC_BASE_URL或base_url是不是写成了https://taotoken.net/api末尾不要多加斜杠或路径。再确认 Key 没有多余空格。还不行就去 API Keys 页面重新生成一个https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。报错五business_type_id子查询返回多行。WHERE business_type_name c_business_type_name如果匹配到多条子查询会报错。加LIMIT 1或者确认business_type_name上有唯一约束。7. 把 Key 和脚本一起管起来到这一步SQL 函数能跑、验证 SQL 能查、AI 工具也接上了统一 Key。剩下的事就是别让这套东西散掉Key 统一在控制台管理脚本统一放版本库验证 SQL 写成固定检查项。长期做编码和 Agent 任务的话Coding Plan 的额度模型比按次调用更省心接入文档里也有各工具的完整配置示例。下次再遇到「游标批量插入 id 自增」这类需求直接把这套函数和验证流程复用一遍就行。
网站建设高端定制企业官网