關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)
一、數(shù)據(jù)類型:
1. update time (更新時(shí)間)
更新時(shí)間戳需要通過觸發(fā)器來實(shí)現(xiàn)。
定義觸發(fā)器
CREATE OR REPLACE FUNCTION "public"."cs_timestamp"()
RETURNS "pg_catalog"."trigger" AS $BODY$
begin
new.updated_time= current_timestamp;
return new;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
創(chuàng)建觸發(fā)器
create trigger cs_time before update on table1 for each row execute procedure cs_timestamp();
2. IN
dapper 判斷了connection 是否是npgsql ,如果是,表示支持 數(shù)組類型,不展開數(shù)組。也就是 in @ids ,在npgsql下不做轉(zhuǎn)化為 in (@p1,@p2…),故 在pgsql 下要用 any(@ids)
例如:
select * from tbl where id = any(@ids);
3. upsert
upsert是一個(gè)組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。為了使用該特性需要使用
INSERT ON CONFLICT: INSERT INTO table_name(column_list) VALUES(value_list) ON CONFLICT target action;
target 可以是:
(column_name):一個(gè)字段名
ON CONSTRAINT constraint_name:其中的 constraint_name 可以是一個(gè)唯一約束的名字
WHERE predicate: WHERE 子句
action為下面兩者之一:
1.DO NOTHING 表示如果數(shù)據(jù)相同則不做任何操作。例如
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO NOTHING;2.DO UPDATE 則表示如果存在以 name為唯一索引的重復(fù)數(shù)據(jù),則做更新操作。
例如:
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO
UPDATE SET email = EXCLUDED.email || ';' || customers.email;其中EXCLUDED為虛擬表,EXCLUDED中包含我們藥更新的記錄,也就是新記錄,而customers為原紀(jì)錄。
4. Boolean
boolean 有"true"或"false"兩個(gè)狀態(tài),第三種"unknown"(未知)狀態(tài),用 NULL 表示;
PostgreSQL支持TRUE和FALSE的以下有效文字值。除了 True 和 False 之外的所有常量值都必須用單引號(hào)引起來
| True | False |
|---|---|
| true | false |
| ‘t’ | 'F ’ |
| ‘true’ | ‘false’ |
| ‘yes’ | ‘no’ |
| ‘1’ | ‘0’ |
例如:
INSERT INTO table (id,status ) VALUES (101, TRUE), (201, FALSE), (301, 't'), (401, '1'), (501, 'y'), (601, 'yes'), (701, 'no'), (801, '0');
5. datetime
PostgreSql中沒有datetime類型,主要有:TIME、DATE、TIMESTAMP、INTERVAL。日期時(shí)間類型輸入像字符串類型輸入一樣,需要加單引號(hào)。每種日期時(shí)間類型都有合法的取值范圍,超出范圍時(shí)系統(tǒng)會(huì)將“零”插入數(shù)據(jù)記錄中。
TIMESTAMP數(shù)據(jù)類型分為 兩種時(shí)間數(shù)據(jù)類型,如下:
Timestamp: : 使用時(shí)間戳數(shù)據(jù)類型 ,不帶時(shí)區(qū)。
Timestamptz: : timestamptz數(shù)據(jù)類型用于帶有時(shí)區(qū)的 。
6. decimal 精確型:
- 精確型:decimal、numeric
- 不精確型:real、double precision(float等價(jià)于double precision)
二、Postgresql函數(shù)與mysql異同點(diǎn):
1. if函數(shù)
不支持if函數(shù),可改為case when語(yǔ)句;
2. Ifnull
改為COALESCE()
例如:COALESCE(a.result, '')
3. 時(shí)間函數(shù)
- 沒有datediff,使用 date_part
date_part(‘epoch’, TIMESTAMP ‘2019-05-05 12:11:20’ - TIMESTAMP ‘2019-05-05 10:10:10’) - date_add替換 now() + interval ‘2 year’;
4. dml schema不一樣
5. group by 聚合函數(shù)和mysql不同
postgresql輸出中的所有字段(包含聚合函數(shù)的計(jì)算字段除外)必須存在于GROUP BY子句中。
6. update join 語(yǔ)法不一致
UPDATE t1 SET t1.c1 = new_value FROM t2 WHERE t1.c2 = t2.c2;
7. delete join語(yǔ)法不一致
PostgreSQL不支持 Delete join語(yǔ)句,但支持delete中using 子句提供類似功能,
DELETE FROM t1 USING t2 WHERE t1.id = t2.id
使用using指定刪除t1 中在 t2中的數(shù)據(jù)
8. 模糊匹配
like 改為 ilike
ilike '%'|| #{testItem} ||'%' 或 like concat('%', #{testItem}, '%')9. 支持retuning子句
insert returning 返回的是新插入的值。
delete returning 返回的是被刪除的值。
update returning 返回的是更新后的值,不能返回更新前的值。
例如:
UPDATE customers SET email = '123' where name='Microsoft' RETURNING email
三、數(shù)據(jù)庫(kù)編碼
- sql 中表名和字段名不要用雙引號(hào)!
- 所有schema(數(shù)據(jù)庫(kù)名,模式名,表名,字段名,字段類型等)定義必須小寫
- 字段前面不能用波浪線 ‘~ ’
- postgresql模式,一版用public,缺省用public。
總結(jié)
到此這篇關(guān)于PostgreSql數(shù)據(jù)庫(kù)與mysql數(shù)據(jù)庫(kù)的不同點(diǎn)以及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)PostgreSql與mysql的不同點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案
PostgreSQL數(shù)據(jù)庫(kù)是一款高度可擴(kuò)展的開源數(shù)據(jù)庫(kù)系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺(tái)或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫(kù)遷移解決方案,需要的朋友可以參考下2023-11-11
postgresql 實(shí)現(xiàn)字符串分割字段轉(zhuǎn)列表查詢
這篇文章主要介紹了postgresql 實(shí)現(xiàn)字符串分割字段轉(zhuǎn)列表查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
PostgreSQL教程(二十):PL/pgSQL過程語(yǔ)言
這篇文章主要介紹了PostgreSQL教程(二十):PL/pgSQL過程語(yǔ)言,本文講解了、PL/pgSQL概述、PL/pgSQL的結(jié)構(gòu)、聲明、基本語(yǔ)句、控制結(jié)構(gòu)等內(nèi)容,需要的朋友可以參考下2015-05-05
查看PostgreSQL數(shù)據(jù)庫(kù)版本的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本,查看PostgreSQL?數(shù)據(jù)庫(kù)的版本號(hào),可用方法很多,文中介紹了三種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12
PostgreSQL教程(七):函數(shù)和操作符詳解(3)
這篇文章主要介紹了PostgreSQL教程(七):函數(shù)和操作符詳解(3),本文講解了序列操作函數(shù)、條件表達(dá)式、數(shù)組函數(shù)和操作符、系統(tǒng)信息函數(shù)、系統(tǒng)管理函數(shù)等內(nèi)容,需要的朋友可以參考下2015-05-05
Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解
PostgreSQL中enable、disable和validate外鍵約束的實(shí)例

