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 还有很多,有空补充