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

相關文章
相關標籤/搜索