自从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);
喜欢务必点个👍