自從Mysql被收購後就商業化了,找來找去Postgresql就被拿來替代了。做爲開源和學究氣息很是濃的數據庫軟件,更新很快,特別是版本9以後,不過在中文技術維護方面的資料仍是有點難找,如下命令都在10.6版本下測試。mysql
1 操做備份與恢復
操做表以前備份表是一個好習慣:linux
CREATE TABLE 目標表_時間戳_操做緣由 AS SELECT * FROM 備份表
恢復數據sql
Truncate TABLE tablename; INSERT INTO 目標表 SELECT * FROM 備份表;
導入指定字段shell
INSERT INTO 目標表 (字段1, 字段2, …) SELECT 字段1, 字段2, …FROM 備份表;
2.psql語句返回值意義
若是psql正常完成,它會向 shell 返回 0。若是它自身發生一個致命錯誤(例如內存用完、找不到文件),它會返回 1。若是到服務器的鏈接出問題而且事務不是交互式的,它會返回2。若是在腳本中發生錯誤,它會返回 3 而且變量ON_ERROR_STOP會被設置。 數據庫
3.不讓psql輸出的文字自動換行
有時候自動換行會讓信息看不清楚,這時候修改下輸出信息格式,pset參數設置和當前使用PG版本有關。windows
\pset pager off 或者 \pset columns 10000
pset [ option [ value ] ]
border 0(沒有邊框)、1(內部分隔線)和 2(表格邊框)有columns 爲wrapped格式設置目標寬度。要不換行,這裏服務器
4.使用函數導入csv等文件必須確保文件格式匹配,儘量轉換爲UTF8,不然沒法導入返回未知錯誤信息。通常從windows保存的文件換行等都有特殊的格式沒法直接導入。 app
5.PG沒有mysql的merge覆蓋插入的功能。只有相似的upsert,當你插入數據碰到已經存在相關條目時,能夠選擇相關操做,Do nothing 或者 相關操做。函數
INSERT INTO table_name(column_list) VALUES ON CONFLICT target action; e.g INSERTINTOcustomers (name, email) VALUES ( ‘Microsoft’, ‘hotline@microsoft.com’ ) ON CONFLICT(name) DO UPDATE SET email =EXCLUDED.email || ‘;’ || customers.email;
6.比較兩表數據區別
在foo表裏但不在bar裏面測試
SELECT ID, NAME, ‘not in bar’ AS note FROM foo EXCEPT SELECT ID, NAME, ‘not in bar’ AS note FROM bar
或者文件比較少的時候,能夠導出成文件,而後使用linux命令grep -v -f bar.table foo.table
7.拷貝數據到文件,可使用內置的copy命令:
COPY persons TO ‘/tmp/persons.csv’WITHDELIMITER‘,’NULLAS ‘’ ;
也能夠選擇幾列,例子:
COPY persons (first\_name,last\_name,email) TO ’C:\\tmp\\persons\_partial\_db.csv’ DELIMITER ‘,’ CSVHEADER;
也能夠條件選擇相關數據copy selected data to csv,能夠用內部copy命令,例子:
\copy (SELECT * FROM persons) to ‘C:\\tmp\\persons\_client.csv’ with csv
8.pg輸出列太長的會自動換行,能夠用x命令,豎直顯示數據條目。
9.結束pg裏的卡住的進程,可以使用pg_stat_activity字段。
select pg_terminate_backend(pid)只能殺單個進程,當要殺多個時候,能夠用下列命令。
select pg_terminate_backend(pid) from pg_stat_activity where state <> 'idle' and now() - pg_stat_activity.query_start > interval '15 minutes' and datname='數據庫名';
pg8版本可以使用select pg_cancel_backend(pid);
喜歡務必點個👍