最近忙于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--要使用的索引方法的名称。能够选择 btree、hash、 gist、spgist和gin。 默认方法是btree
("Id"); -- 一个表列的名称
参考:http://www.postgres.cn/docs/9.5/sql-createindex.html