切换至postgres数据库后PostgreSQL nextval()插入报错求助
问题:切换数据库到postgres后,nextval()插入报错"column does not exist"
错误日志
2024-08-20 10:07:39 2024-08-20 14:07:39.198 UTC [118] ERROR: column "PATIENT_VISIT_SEQ" does not exist at character 601 2024-08-20 10:07:39 2024-08-20 14:07:39.198 UTC [118] STATEMENT: insert into myschema.patient_visit (PATIENT_VISIT_SEQ, CARE_ID, OUT_PRIMARY_EXCHANGE_ALT_ID, OUT_SECONDARY_EXCHANGE_ALT_ID, IN_PRIMARY_EXCHANGE_DROP_ID, FACILITY_ID, MEDICAL_RECORD_NUM, PATIENT_LAST_NM, PATIENT_MIDDLE_NM, PATIENT_FIRST_NM, PATIENT_ID, PATIENT_ACCT_NUM, PATIENT_CLASS_CD, SUBSCRIBER_LAST_NM, SUBSCRIBER_MIDDLE_NM, SUBSCRIBER_FIRST_NM, SUBSCRIBER_ID, ADMISSION_DT, DISCHARGE_DT, CREATE_DT, LOAD_DT, GENDER, DOB, PRODUCT) values (nextval('myschema.PATIENT_VISIT_SEQ'), $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23)
已确认信息
- 序列
myschema.patient_visit_seq存在,clinical_encounter用户拥有访问权限 - 控制台使用相同凭证可成功执行
select nextval('myschema.PATIENT_VISIT_SEQ');和单字段insert语句 - 环境为Docker容器中的postgres:13版本
- 原使用
clinical_encounter数据库,现迁移至postgres数据库,所有schema保留在myschema下
排查建议
- 确认应用连接的数据库:检查应用是否仍在连接旧的
clinical_encounter数据库,可通过打印应用连接参数或查看PostgreSQL连接日志验证。 - 检查search_path配置:执行
show search_path;查看当前用户的搜索路径,若未包含myschema,执行ALTER ROLE clinical_encounter SET search_path TO myschema, public;更新,或在应用连接字符串中指定currentSchema=myschema参数。 - 验证列名大小写:检查表的实际列名,执行
SELECT column_name FROM information_schema.columns WHERE table_schema='myschema' AND table_name='patient_visit';,确认应用SQL中的大写列名是否与实际匹配(PostgreSQL默认不区分大小写,除非建表时用引号包裹)。 - 对比应用与手动执行的SQL:开启PostgreSQL的
log_statement='all',完整记录应用发送的SQL,与手动执行的语句逐字符对比,排查是否存在隐藏字符或语法差异。 - 补充表权限授予:执行
GRANT ALL ON ALL TABLES IN SCHEMA myschema TO clinical_encounter;,确保用户对表有完整操作权限。 - 检查Docker容器数据一致性:进入容器执行
\d myschema.patient_visit和\ds myschema.patient_visit_seq,确认表和序列的结构与预期一致,避免容器数据卷挂载异常导致的对象缺失。
内容的提问来源于stack exchange,提问作者ed4becky
相关产品推荐
相关产品推荐

