pgsql 迁移到mysql所遇到的坑

本文详细记录了从PgSQL迁移到MySQL过程中遇到的关键差异,包括数据类型、索引创建、特殊名称使用、临时表操作及占位符使用等,为开发者提供实用的迁移指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近由于工作的原因,需要将一个开源项目的数据库从pgsql迁移到mysql, 特此记录下所要注意的点, 后续不断更新

  1. MySQL timestamp 类型没有with time zone
  2. pgsql 创建索引的时候没有索引名称,使用下述命令 create index xxxx
  3. MySQL并不支持创建 type Enum create type xxx Enum('', '', '')
  4. pgsql 可以使用一些特殊的名称创建 table name 以及 column name, 但是mysql 不行(i.e. key(column), value(column), Lock(table)
  5. 通过with xxx创建临时表, 在mysql中无法在里面使用insert 语句,反之 pgsql可以
  6. 在使用golang, 访问两者的数据库的时候.
  • MySQL 使用作为占位符,缺点是无法复用,并且无法作为identifiers(i.e.select ? from xxx
  • pgsql 使用$1,$2作为placeholder, 可以在语句中多出复用, 并且可以作为 identifiers 作用于select 后面

ps: pgsql可以使用如下方式在插入中查询当前要插入的值是否已经存在,并返回新插入的值 or 已存在的数据的id返回(MySQL 并不支持)

		WITH new_namespace AS (
			INSERT INTO Namespace(name, version_format)
			SELECT CAST($1 AS VARCHAR), CAST($2 AS VARCHAR)
			WHERE NOT EXISTS (SELECT name FROM Namespace WHERE name = $1)
			RETURNING id
		)
		SELECT id FROM Namespace WHERE name = $1
		UNION
		SELECT id FROM new_namespace
### MySQL 迁移至 PostgreSQL 的方法 对于希望将 MySQL 数据库迁移到 PostgreSQL 的用户来说,有多种工具和策略可供选择。一些常用的工具有 Flyway、Liquibase 和 pgloader 等[^1]。 #### 使用 Navicat 工具进行迁移 Navicat 提供了一种直观的方式来进行数据库之间的数据迁移工作。通过其图形界面,用户能够轻松设置源数据库(即 MySQL)以及目标数据库(即 PostgreSQL),并执行整个迁移过程[^2]。 ```sql -- 示例 SQL 脚本用于验证连接 (仅作示意用途) SELECT version(); ``` #### 利用命令行工具 mysqldump 导出与 psql 导入 另一种常见的做法是先利用 `mysqldump` 命令导出 MySQL 中的数据为纯文本文件形式;之后再借助于 PostgreSQL 自带的客户端程序 `psql` 将这些转储出来的结构化查询语句应用到新的 PG 实例当中去完成导入操作。 ```bash # 备份 MySQL 数据库 mysqldump --compatible=postgresql -u root -p mydb > /path/to/mydb.sql # 修改 dump 文件中的语法差异后,在 PostgreSQL 上创建新表空间及模式 createdb new_db_name psql -U postgres -f /path/to/mydb_converted.sql new_db_name ``` #### 关键注意事项 - **兼容性调整**:由于两种 RDBMS 存在一定的实现细节上的区别,因此可能需要手动修改部分 DDL/DML 语句来适应 PostgreSQL 特定的功能特性或约束条件。 - **字符集处理**:确保两者的编码方式一致非常重要,尤其是在涉及到多字节字符的情况下更应小心谨慎对待这个问题。 - **索引重建**:某些情况下原有的索引定义可能会因为版本间的变化而失效,则需重新评估现有设计是否合理有效,并据此作出相应改动[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值