一、數(shù)據(jù)類型:
1. update time (更新時間)
更新時間戳需要通過觸發(fā)器來實現(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是一個組合詞,即當(dāng)往表中插入記錄,如果該記錄已存在則更新,否則插入新記錄。為了使用該特性需要使用
INSERT ON CONFLICT:
INSERT INTO table_name(column_list)
VALUES(value_list)
ON CONFLICT target action;
target 可以是:
(column_name):一個字段名
ON CONSTRAINT constraint_name:其中的 constraint_name 可以是一個唯一約束的名字
WHERE predicate: WHERE 子句
action為下面兩者之一:
- DO NOTHING 表示如果數(shù)據(jù)相同則不做任何操作。例如
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO NOTHING;
- 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"兩個狀態(tài),第三種"unknown"(未知)狀態(tài),用 NULL 表示;
PostgreSQL支持TRUE和FALSE的以下有效文字值。除了 True 和 False 之外的所有常量值都必須用單引號引起來
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。日期時間類型輸入像字符串類型輸入一樣,需要加單引號。每種日期時間類型都有合法的取值范圍,超出范圍時系統(tǒng)會將“零”插入數(shù)據(jù)記錄中。
TIMESTAMP數(shù)據(jù)類型分為 兩種時間數(shù)據(jù)類型,如下:
Timestamp: : 使用時間戳數(shù)據(jù)類型 ,不帶時區(qū)。
Timestamptz: : timestamptz數(shù)據(jù)類型用于帶有時區(qū)的 。
6. decimal
- 精確型:decimal、numeric
- 不精確型:real、double precision(float等價于double precision)
二、Postgresql函數(shù)與mysql異同點:
1. if函數(shù)
不支持if函數(shù),可改為case when語句;
2. Ifnull
改為COALESCE()
例如:COALESCE(a.result, '')
3. 時間函數(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ù)的計算字段除外)必須存在于GROUP BY子句中。
6. update join 語法不一致
UPDATE t1
SET t1.c1 = new_value
FROM t2
WHERE t1.c2 = t2.c2;
7. delete join語法不一致
PostgreSQL不支持 Delete join語句,但支持delete中using 子句提供類似功能,
DELETE FROM t1
USING t2
WHERE t1.id = t2.id
使用using指定刪除t1 中在 t2中的數(shù)據(jù)
8. 模糊匹配
like 改為 ilike文章來源:http://www.zghlxwxcb.cn/news/detail-428395.html
ilike '%'|| #{testItem} ||'%' 或 like concat('%', #{testItem}, '%')
9. 支持retuning子句
insert returning 返回的是新插入的值。
delete returning 返回的是被刪除的值。
update returning 返回的是更新后的值,不能返回更新前的值。
例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-428395.html
UPDATE customers SET email = '123' where name='Microsoft' RETURNING email
三、數(shù)據(jù)庫編碼
- sql 中表名和字段名不要用雙引號!
- 所有schema(數(shù)據(jù)庫名,模式名,表名,字段名,字段類型等)定義必須小寫
- 字段前面不能用波浪線 ‘~ ’
- postgresql模式,一版用public,缺省用public。
到了這里,關(guān)于關(guān)于PostgreSql數(shù)據(jù)庫和mysql的不同點及注意事項的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!