最近忙於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