上期有說(shuō),數(shù)據(jù)環(huán)境切換,由MySQL換成PostgreSQL。
那么為了大家以后少踩坑,簡(jiǎn)單總結(jié)了下我曾踩過(guò)的坑和需要注意的點(diǎn)。
首先PostgreSQL有一個(gè)模式的概念。
一、格式區(qū)別:
和Oracle一樣,PostgreSQL也是嚴(yán)格區(qū)分大小寫。
二、符號(hào)區(qū)別:
和Oracle一樣PostgreSQL中," " 雙引號(hào)是區(qū)分庫(kù)名,關(guān)鍵字等,而MySQL則是反單引號(hào)
(tab鍵上方的鍵),pg查詢時(shí)字符類型的字段必須使用單引號(hào),而MySQL帶有優(yōu)化器(不是必須)。
三、自增區(qū)別:
MySQL中使用auto_increment ,在需要的列指定自增,而pg中需要設(shè)置自增序列。
(1)使用SQL語(yǔ)句
①創(chuàng)建表時(shí)
CREATE table infisa_template_config(id serial );
②表已存在
<--設(shè)置序列從1開始,自增1-->
CREATE SEQUENCE user_id_seq START WITH 1
INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
<--設(shè)置序列-->
ALTER table user ALTER column id SET DEFAULT nextval('user_id_seq');
(2)使用可視化工具
連接navicat15(或者使用DBeaver)
點(diǎn)擊序列
可以通過(guò)可視化界面新建序列
注:同步數(shù)據(jù)的話,推薦通過(guò)sql方式新建序列。
四、函數(shù)區(qū)別:
(1)時(shí)間轉(zhuǎn)化
①時(shí)間轉(zhuǎn)字符串:
MySQL: date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)
PostgreSQL: to_char(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
②字符串轉(zhuǎn)時(shí)間:
MySQL: date_format(a.tag_create_date,‘%Y-%m-%d %H:%i:%s’)
PostgreSQL: to_date(a.tag_create_date,‘yyyy-mm-dd HH:MM:SS’)
(2) IFNULL()函數(shù)
MySQL: IFNULL(a.idm,‘’)
PostgreSQL: COALESCE(a.id,‘’)
(3) sysdate()函數(shù)
MySQL: SELECT sysdate()
PostgreSQL: SELECT now()
(4) find_in_set()函數(shù)(允許在逗號(hào)分隔的字符串列表中查找指定字符串的位置)
MySQL: SELECT t.dept_id FROM sys_dept t WHERE find_in_set(‘100’, ancestors)
PostgreSQL: SELECT t.dept_id FROM sys_dept t WHERE ‘100’ = ANY (string_to_array(ancestors, ‘,’))
(5)group_concat()函數(shù)
MySQL: select a.name,group_concat(distinct city)from user_city a group by a.name;
PostgreSQL: select a.name,array_to_string(array_agg(distinct a.city),‘,’)from user_city a group by a.name;
(6)LIMIT
MySQL: select id,name from hospital.ods_user_basic limit 10,2;
PostgreSQL: select id,name from hospital.ods_user_basic limit 10 offset 2;
(7)DISTINCT
MYSQL: select DISTINCT b.id from hospital.ods_user_basic as b
PostgreSQL: select DISTINCT ON (b.id) b.* from hospital.ods_user_basic as b
(注:pg中祛重+排序 ,使用distinct on (列1) order by 列1 )
(8)MyBatis-Plus整合MySQL、PostgreSQL,LIKE使用
MySQL:
<select id="checkReportPage" resultMap="reportResultMap">
SELECT
*
FROM
infisa_medical_report
WHERE is_deleted=0 AND status = 1 AND name LIKE concat('%',#{handleTask.name},'%')
</select>
PostgreSQL:
<select id="checkReportPage" resultMap="reportResultMap">
SELECT
*
FROM
infisa_medical_report
WHERE is_deleted=0 AND status = 1 AND name like concat('%',#{handleTask.name}::varchar,'%')
</select>
(注:pg必須指定模糊查詢列的數(shù)據(jù)類型,否則會(huì)報(bào)錯(cuò))
五、數(shù)據(jù)類型轉(zhuǎn)化(針對(duì)于PostgreSQL):
MySQL、Oracle等都是默認(rèn)對(duì)數(shù)據(jù)類型進(jìn)行了隱式的轉(zhuǎn)換,在其他數(shù)據(jù)庫(kù)varchar等字符串類型和數(shù)字可以進(jìn)行自動(dòng)的隱式轉(zhuǎn)換,但是PG確沒(méi)有這么處理,官方文檔中也有針對(duì)pg的數(shù)據(jù)轉(zhuǎn)換方式。
解決辦法:
①?gòu)?qiáng)轉(zhuǎn)(在查詢字段上指定數(shù)據(jù)類型)
a.a1 = b.b1::int8 或者 a.a1::varchar = b.b1
②隱式類型轉(zhuǎn)化(創(chuàng)建類型轉(zhuǎn)換)
–注:創(chuàng)建cast需要有pg_cast系統(tǒng)表的權(quán)限
–注:當(dāng)創(chuàng)建類型轉(zhuǎn)換使用自動(dòng)隱式轉(zhuǎn)換的話如果出現(xiàn)多個(gè)匹配的轉(zhuǎn)換此時(shí)pg會(huì)因?yàn)椴恢肋x擇哪一個(gè)去處理類型轉(zhuǎn)換而報(bào)錯(cuò),
–如果出現(xiàn)多個(gè)隱式自動(dòng)轉(zhuǎn)換都匹配此時(shí)還是需要手動(dòng)添加轉(zhuǎn)換以達(dá)到效果,或者刪除多余的類型轉(zhuǎn)換
CREATE CAST (INTEGER AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS INTEGER) WITH INOUT AS IMPLICIT;
CREATE CAST (BIGINT AS VARCHAR) WITH INOUT AS IMPLICIT;
CREATE CAST (VARCHAR AS BIGINT) WITH INOUT AS IMPLICIT;
附:
③查詢當(dāng)前類型轉(zhuǎn)化:
–這個(gè)查詢是當(dāng)前所有的CAST,具體字段的定義同樣可以參閱PG數(shù)據(jù)庫(kù)官方文檔里的描述
select
(select typname from pg_type where oid = t.castsource) as “castsource”,
(select typname from pg_type where oid = t.casttarget) as “casttarget”,
castcontext,
castmethod
from pg_cast as t
④刪除類型轉(zhuǎn)化:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-453258.html
DROP CAST (varchar as bigint); DROP CAST (bigint as varchar);文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-453258.html
到了這里,關(guān)于盤點(diǎn)一下PostgreSQL和MySQL的區(qū)別點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!