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

如何将MySQL的current时间戳字段通过pgloader迁移至PostgreSQL

问题根因

报错是因为pgloader迁移时对MySQL的DATETIME字段默认值表达式解析异常:

  • MySQL支持current_timestamp() + interval 10 year作为datetime默认值,pgloader解析该表达式时错误转换为PostgreSQL不识别的current常量值,触发0A000错误
  • MySQL的DATETIME类型对应PostgreSQL的timestamp without time zone或timestamp with time zone类型,默认值表达式的interval语法也存在差异,PostgreSQL中等价的默认值写法为CURRENT_TIMESTAMP + INTERVAL '10 years'
解决方法

方案1:修改pgloader配置,增加类型与默认值映射(无需修改原MySQL库)

编辑你的scenario.load配置文件,增加字段转换规则,针对tariff表的start_date字段单独指定类型和默认值,配置示例如下:

LOAD DATABASE
FROM mysql://user:password@127.0.0.1/database1
INTO postgresql://postgres:postgres@127.0.0.1:5432/database2

CAST
    type datetime to timestamp drop default drop not null using zero-dates-to-null,
    column tariff.start_date to timestamp with time zone default 'CURRENT_TIMESTAMP + INTERVAL ''10 years'''
;

配置规则说明:

  • 先将所有datetime类型默认转换为PG的timestamp类型,丢弃原默认值避免解析错误
  • 单独指定tariff表的start_date字段的类型和正确的PG格式默认值

方案2:提前在PostgreSQL侧建表,pgloader仅迁移数据

如果表结构不多,你可以先在目标PostgreSQL库手动建好tariff表,再调整pgloader配置让它跳过建表步骤,只迁移数据:

  1. 先在PostgreSQL的目标库执行建表语句:
CREATE SCHEMA IF NOT EXISTS yamalkernel;
CREATE TABLE yamalkernel.tariff (
    -- 其他字段按实际业务需求补全
    start_date TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP + INTERVAL '10 years'
    -- 其他字段按实际业务需求补全
);
  1. 修改scenario.load配置,增加跳过建表的配置:
LOAD DATABASE
FROM mysql://user:password@127.0.0.1/database1
INTO postgresql://postgres:postgres@127.0.0.1:5432/database2

WITH no schema creation, create tables no

ALTER TABLE NAMES MATCHING 'tariff' SET SCHEMA 'yamalkernel'
;

配置规则说明:

  • no schema creation:禁止pgloader自动创建schema
  • create tables no:禁止pgloader自动建表,只会把数据写入已存在的对应表中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:09:02