mysql迁移成postgresql

1、navicat迁移表结构+数据
参考:https://blog.csdn.net/m0_54355172/article/details/126599005

2、增量脚本

--1、将所有字段名称转换为小写(pgsql大小写敏感,默认小写)
DO $$
DECLARE
    tbl_name text;
    col_name text;
    new_col_name text;
    sql text;
BEGIN
    -- 遍历所有表和字段
    FOR tbl_name, col_name IN
        SELECT table_name, column_name
        FROM information_schema.columns
        WHERE table_schema = 'public'
    LOOP
        -- 生成新的字段名(小写)
        new_col_name := lower(col_name);
        
        -- 如果字段名已经是小写,跳过
        IF col_name = new_col_name THEN
            CONTINUE;
        END IF;
        
        -- 生成 ALTER TABLE 语句
        sql := format('ALTER TABLE %I RENAME COLUMN %I TO %I;', tbl_name, col_name, new_col_name);
        
        -- 执行 ALTER TABLE 语句
        EXECUTE sql;
    END LOOP;
END $$;
-- 2、给所有字段名称为id增加自增序列
DO $$ 
DECLARE
    r RECORD;
    seq_name TEXT;
    table_name TEXT;
BEGIN
    -- 遍历public schema下所有名为 id 的字段
    FOR r IN 
        SELECT c.table_name, c.column_name
        FROM information_schema.columns c  -- 给表起别名
        WHERE c.table_schema = 'public'
          AND c.column_name = 'id'
          AND c.data_type NOT IN ('serial', 'bigserial')  -- 排除已经是 serial 或 bigserial 的字段
    LOOP
        table_name := r.table_name;
        seq_name := r.table_name || '_id_seq';

        -- 为字段创建一个序列
        EXECUTE 'CREATE SEQUENCE IF NOT EXISTS public.' || seq_name;

        -- 修改字段类型为 bigint,并显式指定转换方式
        EXECUTE 'ALTER TABLE public.' || table_name || ' ALTER COLUMN id SET DATA TYPE bigint USING id::bigint';

        -- 设置字段的默认值为序列的下一个值
        EXECUTE 'ALTER TABLE public.' || table_name || ' ALTER COLUMN id SET DEFAULT nextval(''public.' || seq_name || ''')';

        -- 同步序列的当前值,取表中的最大id值
        EXECUTE 'SELECT setval(''public.' || seq_name || ''', COALESCE((SELECT MAX(id) FROM public.' || table_name || '), 1))';
    END LOOP;
END $$;

--3、增加默认值(下面的脚本在mysql下执行,将结果复制到对应pgsql数据库下执行)
SELECT
    CONCAT(
        'ALTER TABLE ',
        CASE
            WHEN TABLE_NAME IN ('user', 'select', 'from', 'where', 'insert', 'delete', 'update', 'join', 'grant', 'order', 'group', 'table', 'columns', 'database', 'index', 'case', 'when', 'then', 'else')
            THEN CONCAT('"', LOWER(TABLE_NAME), '"')  -- 如果是关键字,则加双引号
            ELSE TABLE_NAME
        END,
        ' ALTER COLUMN ',
        CASE
            WHEN COLUMN_NAME IN ('user', 'select', 'from', 'where', 'insert', 'delete', 'update', 'join', 'grant', 'order', 'group', 'table', 'columns', 'database', 'index', 'case', 'when', 'then', 'else')
            THEN CONCAT('"', LOWER(COLUMN_NAME), '"')  -- 如果是关键字,则加双引号
            ELSE COLUMN_NAME
        END,
        ' SET DEFAULT ',
        CASE
            WHEN COLUMN_DEFAULT LIKE 'CURRENT_TIMESTAMP%' THEN 'CURRENT_TIMESTAMP'  -- 如果默认值是 CURRENT_TIMESTAMP,直接使用它
            WHEN COLUMN_DEFAULT = '0000-00-00 00:00:00' THEN "'1970-01-01 00:00:00'"  -- 如果默认值是 '0000-00-00 00:00:00',替换为 '1970-01-01 00:00:00'
            WHEN DATA_TYPE IN ('character varying', 'character', 'text', 'VARCHAR', 'timestamp', 'date', 'datetime')
            THEN CONCAT("'", COLUMN_DEFAULT, "'")  -- 对字符串类型和日期类型加上单引号
            ELSE COLUMN_DEFAULT
        END,
        ';'
    ) AS alter_statement
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE
    COLUMN_DEFAULT IS NOT NULL
    AND TABLE_SCHEMA = 'student'; -- 需要根据不同数据库进行填写

3、代码适配改动
3.1@TableFiled(value =“大写”) 改成 @TableFiled(value =“小写”)
3.2 mybatis严格校验数据类型 例如 mybatis传参为boolean pgsql对应字段为integer会报错,mysql可以默认转换
3.3 limit a,b 改成 limit b offset a
3.4 如果字段名为关键词(order、join、index等)需要mybatis加双引号
3.5 还有很多,有空补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值