在Mysql被收购后,Postgresql就被拿来替代使用了。作为开源和学究气息非常浓的数据库软件,更新很快,特别是版本9之后,不过在中文技术维护方面的资料还是有点难找,以下命令都在10.6版本下测试。
1 操作备份与恢复
操作表之前备份表是一个好习惯:
CREATE TABLE 目标表_时间戳_操作原因 AS SELECT * FROM 备份表
恢复数据
Truncate TABLE tablename;
INSERT INTO 目标表 SELECT * FROM 备份表;
导入指定字段
INSERT INTO 目标表 (字段1, 字段2, …) SELECT 字段1, 字段2, …FROM 备份表;
2.psql语句返回值意义
如果psql正常完成,它会向 shell 返回 0。如果它自身发生一个致命错误(例如内存用完、找不到文件),它会返回 1。如果到服务器的连接出问题并且事务不是交互式的,它会返回2。如果在脚本中发生错误,它会返回 3 并且变量ON_ERROR_STOP会被设置。
3.不让psql输出的文字自动换行
有时候自动换行会让信息看不清楚,这时候修改下输出信息格式,pset参数设置和当前使用PG版本有关。
\pset pager off
或者
\pset columns 10000
pset [ option [ value ] ]
border 0(没有边框)、1(内部分隔线)和 2(表格边框)有columns 为wrapped格式设置目标宽度。要不换行,这里
4.使用函数导入csv等文件必须确保文件格式匹配,尽可能转换为UTF8,否则无法导入返回未知错误信息。一般从windows保存的文件换行等都有特殊的格式无法直接导入。
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’,
‘[email protected]’
)
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);