公司最近从 Mysql 切换到了 CockroachDB ,所以在这里记录下期间遇到的一些问题
CockroachDB版本 V20.2.3
maven需要引入依赖
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.9</version>
</dependency>
配置文件修改
spring.datasource.url=jdbc:postgresql://host:port/DB?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&sslmode=require
spring.datasource.driver-class-name=org.postgresql.Driver
这里需要注意如果没有加上 &sslmode=require 会报下面的错误
Caused by: org.postgresql.util.PSQLException: ERROR: node is running secure mode, SSL connection required
数据库迁移的话我用的是Navicat
CockroachDB 因为是分布式数据库的原因,官方推荐是使用UUID来当主键,但是我们公司项目大部分主键是long类型的,所以我使用了 SERIAL8 类型用作主键,SERIAL8 就是mysql里面的bigint。
SERIAL 类型等效于 INT DEFAULT unique_rowid()。
意思就是int类型默认是唯一自增的,如果不用SERIAL 后面就要加入 unique_rowid()这个唯一自增的函数。
CREATE TABLE logon (
user_id SERIAL primary key NOT NULL,
logon_date DATE
);
现在生成的主键id就是唯一且自增的,但是不一定连续,官方解释是为了更快的生成id。如果要让insert语句返回id还需要在 sql语句最后加上 RETURNING PRIMARY KEY。
INSERT INTO users(username) VALUES ('jack') RETURNING user_id;
CockroachDB 的分页跟mysql也有一点不一样。
// mysql
SELECT * FROM accounts limit pageBegin pageSize;
// CockroachDB
SELECT * FROM accounts limit pageSize offset pageBegin;
offset 表示偏移从哪里开始,也就是从第几条数据开始查询。
格式化时间函数替换
// mysql
SELECT
DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s'),
FROM
talbe;
// CockroachDB
SELECT
experimental_strftime(create_time, '%Y-%m-%d-%H-%M-%S'),
FROM
talbe;
注意后面的strftime表示法并非一样。
CockroachDB 并没有 GROUP_CONCAT 这个函数,不过我们可以使用 函数 array_agg 替代,如果要返回一个拼接的string类型,还可以在外面再包一层函数 array_to_string
SELECT
array_to_string(array_agg(type_id),','),
FROM
talbe
表示返回一个 type_id的数组并用,号进行拼接。
这里使用到 JSONB 类型主要是替换之前存储再mongoDB里面的数据类型,因为我们公司业务就只有两个字段,一个id,一个json内容,所以这里直接用 CockroachDB 的 UPSERT 语句,相当于mysql 的 ON DUPLICATE KEY UPDATE ,我觉得这里使用起来比mysql方便太多。
官方给出的介绍
UPSERT 语句是 INSERT ON CONFLICT语句的简称。当UPSERT的指定值不违反唯一性约束时,插入数据,如果违反了唯一性约束,则更新这行数据
简单来说 如果你的主键就是唯一性约束条件就用 UPSERT 就行了,否者需要用 INSERT ON CONFLICT。
插入语句
UPSERT INTO user_template(template_id ,user_template) values(1,'json')
http://doc.cockroachchina.baidu.com/#develop/sql-feature-support/sql-support-summary/