天天看点

pgsql 迁移到mysql所遇到的坑

最近由于工作的原因,需要将一个开源项目的数据库从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