最近由于工作的原因,需要将一个开源项目的数据库从pgsql迁移到mysql, 特此记录下所要注意的点, 后续不断更新
- MySQL timestamp 类型没有with time zone
- pgsql 创建索引的时候没有索引名称,使用下述命令
create index xxxx
- MySQL并不支持创建 type Enum
create type xxx Enum('', '', '')
- pgsql 可以使用一些特殊的名称创建 table name 以及 column name, 但是mysql 不行(i.e.
key(column), value(column), Lock(table)
) - 通过
with xxx
创建临时表, 在mysql中无法在里面使用insert 语句,反之 pgsql可以 - 在使用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