Postgresql使用经常使用技巧

自从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);

喜欢务必点个👍