You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pgloader带--with 'quote identifiers'迁移时出现列不存在错误

MySQL到PostgreSQL迁移:保留驼峰命名同时解决列不存在错误

问题原因

PostgreSQL对带双引号的标识符大小写敏感,而MySQL默认不区分。用--with "quote identifiers"时,pgloader会把MySQL的驼峰列名(如invoiceNo)转成PostgreSQL的"invoiceNo",但如果迁移过程中关联的PL/pgSQL代码引用列时没加双引号,或者pgloader自动映射出现重复双引号(比如生成""invoiceNo""),就会触发column ""invoiceNo"" does not exist错误。

可行解决方案

1. 自定义pgloader加载脚本,精准控制标识符映射

写一个自定义加载脚本,显式指定表和列的带引号命名,避免自动映射的问题:

-- 保存为 load-mysql-to-pgsql.load
LOAD DATABASE
   FROM mysql://[用户名]:[密码]@[MySQL地址]/[数据库名]
   INTO postgresql://[用户名]:[密码]@[PG地址]/[数据库名]

   WITH quote identifiers,
        create tables,
        create indexes,
        reset sequences

   -- 显式映射表和列的命名
   ALTER TABLE NAMES
        MATCHING 'Order' TO '"Order"'
   ALTER COLUMN NAMES
        MATCHING 'invoiceNo' TO '"invoiceNo"'
   ;

执行命令:pgloader load-mysql-to-pgsql.load
这种方式能确保驼峰命名被正确带引号创建,同时避免重复双引号的问题。

2. 修复关联的PL/pgSQL代码

错误提示中的PL/pgSQL代码大概率是引用列时没加双引号,导致PostgreSQL自动把invoiceNo转成小写invoiceno,但实际列是带引号的"invoiceNo",自然找不到。
把代码里的列引用改成带双引号的形式:

-- 修正前
SELECT invoiceNo FROM "Order";

-- 修正后
SELECT "invoiceNo" FROM "Order";

3. 临时调整PostgreSQL的大小写配置(仅限新库)

如果是全新的PostgreSQL数据库,可以修改postgresql.conf:

lower_case_table_names = 1

重启数据库后,PostgreSQL会自动把未加引号的标识符转为小写,但同时也能识别带引号的驼峰标识符。注意:这个配置只能在数据库初始化前或清空数据后设置,否则会引发对象冲突,不推荐长期使用。

内容的提问来源于stack exchange,提问作者antonwilhelm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:05:10