PostgreSQL 迁移指南:从 MySQL 转过来需要注意什么

PostgreSQL Migration Guide: What to Watch When Coming from MySQL

| Kevin | 2026-09-01T12:51:15

最近把一个项目从 MySQL 迁移到了 PostgreSQL,整理了一下两者的主要差异和迁移过程中的注意事项。

Recently migrated a project from MySQL to PostgreSQL. Documenting key differences and migration considerations.

新项目决定用 PostgreSQL 替代 MySQL,作为一个用了多年 MySQL 的开发,记录一下迁移过程中发现的差异。 语法差异 1. 自增主键 -- MySQL CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY ); -- PostgreSQL CREATE TABLE users ( id BIGSERIAL PRIMARY KEY ); -- 或者用 GENERATED ALWAYS AS IDENTITY (更标准) CREATE TABLE users ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY ); 2. 字符串函数 -- MySQL: GROUP_CONCAT SELECT GROUP_CONCAT(name SEPARATOR ',') FROM tags; -- PostgreSQL: STRING_AGG SELECT STRING_AGG(name, ',') FROM tags; -- MySQL: IFNULL SELECT IFNULL(name, 'default') FROM users; -- PostgreSQL: COALESCE (标准 SQL,MySQL 也支持) SELECT COALESCE(name, 'default') FROM users; 3. 分页 -- 两者都支持,但行为略有不同 -- MySQL: LIMIT offset, count SELECT * FROM users LIMIT 10, 20; -- PostgreSQL: LIMIT count OFFSET offset SELECT * FROM users LIMIT 20 OFFSET 10; PostgreSQL 的优势 JSONB 类型:原生支持 JSON 查询和索引,比 MySQL 的 JSON 类型强得多 数组类型:字段可以是数组,省去了关联表 全文搜索:内建 tsvector 全文搜索,简单场景不需要 ES CTE 和窗口函数:支持更完善(MySQL 8.0+ 也支持了,但 PG 更成熟) 事务 DDL:ALTER TABLE 可以在事务里回滚,MySQL 不行 迁移工具 用 pgloader 可以直接从 MySQL 迁移数据到 PostgreSQL: pgloader mysql://user:pass@localhost/mydb postgresql://user:pass@localhost/mydb 它会自动处理类型映射,比如 MySQL 的 TINYINT(1) 会映射成 PostgreSQL 的 BOOLEAN。但还是建议迁移后仔细检查数据类型和索引。 ORM 层面 如果用的是 JPA/Hibernate 或 MyBatis,切换成本不大。主要改数据源配置和方言设置,大部分 SQL 不需要改。但如果直接写了 MySQL 特有语法(比如 INSERT ... ON DUPLICATE KEY UPDATE),需要改成 PG 的 INSERT ... ON CONFLICT DO UPDATE。


Documenting key differences when migrating from MySQL to PostgreSQL. Syntax Differences Auto-increment (AUTO_INCREMENT → BIGSERIAL), string functions (GROUP_CONCAT → STRING_AGG), pagination syntax differences. PostgreSQL Advantages JSONB with indexing, native array types, built-in full-text search, transactional DDL (rollback ALTER TABLE). Migration Use pgloader for automatic data migration with type mapping. ORM changes are minimal - mainly datasource config and dialect settings.

← Back to News