Postgresql 迁移随笔一

最近忙于MSSQL 迁移到Postgresql的工程,在这里记录一下迁移遇到的问题以及解法。html

程序语言:javajava

要求,根据不一样的driver能够同时支援多种数据库,目前主要为MSSQL 和Postgresql正则表达式

case 1.大小写敏感,MSSQL能够设置大小写不敏感,可是Postgresql是大小写敏感的。相同的select方法会致使postgresql中执行失败。sql

目前解法:数据库

严格要求数据库中大小写规范,并代码中再select中使用双引号进行栏位以及表名的查询。post

MSSQL和Postgresql 能够同时支援对应的语法。spa

(非特别的语句或关键字执行经过)。 postgresql

解法2:所有转成小写。 由于MSSQL大小写不敏感,因此转小写后,MSSQL同样支援。 code

 值的大小写查询。可使用正则表达式,或使用索引,建立容许大小写无关搜索,见索引参考。 htm

正则表达式:

正则表达式匹配操做符:

操做符 描述 例子
~ 匹配正则表达式,大小写相关 'thomas' ~ '.*thomas.*'
~* 匹配正则表达式,大小写无关 'thomas' ~* '.*Thomas.*'
!~ 不匹配正则表达式,大小写相关 'thomas' !~ '.*Thomas.*'
!~* 不匹配正则表达式,大小写无关 'thomas' !~* '.*vadim.*'


例如:

找出数据表account中全部用户名包含baidu且不区分大小写的用户的信息。

select * from account where username ~* 'baidu';

使用正则表达式以后能够实现不区分大小写的功能,而且大大减小了sql语句的长度。

摘自:http://blog.163.com/clevertanglei900@126/blog/static/1113522592010102215419516/

 

case 2:存储过程,MSSQL和Postgresql中都有存储过程,可是呼叫的方式不一样。 

MSSQL中,可使用call 或exec的方法执行,可是Postgresql中不支援call的呼叫方式,为了达到同一套code支援两种db

目前解法:移植存储过程到java中(可是这样效能上,以及灵活上会有必定的差别,鉴于目前工程中SP逻辑较为简单,因此进行移植)

 

case 3:MSSQL中,大部分Id的栏位会是自动增加的类型 。 

Postgresql中,使用序列对象(SEQUENCE)来进行。 

例如:

DROP SEQUENCE IF EXISTS public."Table_Id_seq";

CREATE SEQUENCE public."Table_Id_seq"
INCREMENT 1 -- 一个正值将产生一个上升序列,一个负值会产生一个降低序列。若是 没有指定,旧的增量值将被保持
MINVALUE 1  --最小值
MAXVALUE 9223372036854775807  --最大值
START 1 -- 开始值
CACHE 1;  回卷
ALTER TABLE public."Table_Id_seq"
OWNER TO postgres;

参考:http://www.postgres.cn/docs/9.5/sql-altersequence.html

 

case 4:索引(index) MSSQL中,一些表中会存在索引,Postgresql中将从新创建对应的索引。 

索引主要用于提高执行效率。 

PostgreSQL提供了索引方法 B-树、哈希、GiST、SP-GiST 以及 GIN。用户也能够定义本身的索引 方法,可是相对较复杂。

DROP INDEX IF EXISTS public."Table_Increment_Key";

CREATE INDEX "Table_Increment_Key"
ON public."Table"
USING btree--要使用的索引方法的名称。能够选择 btreehash、 gistspgistgin。 默认方法是btree
("Id"); -- 一个表列的名称

参考:http://www.postgres.cn/docs/9.5/sql-createindex.html

相关文章
相关标签/搜索