数据定义

数据库

-- 创建数据库
-- https://www.postgresql.org/docs/current/static/multibyte.html
-- database_name,数据库名称
-- database_user,用户名
CREATE DATABASE {database_name} WITH OWNER = {database_user};
CREATE DATABASE {database_name} OWNER {database_user}; -- LC_COLLATE:string sort order
-- LC_CTYPE:character classification
-- database_name,数据库名称
-- database_user,用户名
CREATE DATABASE {database_name} WITH OWNER = {database_user} ENCODING 'UTF8' LC_COLLATE = 'zh_CN.UTF-8' LC_CTYPE = 'zh_CN.UTF-8';
-- OR WINDOWS
CREATE DATABASE {database_name} WITH OWNER = {database_user} ENCODING 'UTF8' LC_COLLATE = 'Chinese (Simplified)_China.936' LC_CTYPE = 'Chinese (Simplified)_China.936'; -- 复制数据库
-- database_name,数据库名称
-- database_user,用户名
-- original_database_name,原始数据库名称
CREATE DATABASE {database_name} WITH TEMPLATE {original_database_name} OWNER {database_user};

-- 新增列
-- table_name,表名
-- column_name,列名
-- column_type,列类型
ALTER TABLE {table_name} ADD COLUMN IF NOT EXISTS {column_name} {column_type} [NULL | NOT NULL];

扩展

-- 创建 UUID 扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- 验证 UUID 扩展
SELECT uuid_generate_v4(); -- 创建 cube 扩展
CREATE EXTENSION IF NOT EXISTS cube; -- 创建 earthdistance 扩展
CREATE EXTENSION IF NOT EXISTS earthdistance;

函数

-- 隐式将整形转换成字符串,但是会有一些问题,参考 https://stackoverflow.com/questions/50025750/postgres-convert-integer-into-text。通常情况下还是建议使用 CAST 函数来实现。
-- 使用场景:在数据库迁移的时候(比如 Microsoft SQL Server 转成 PostgreSQL,Microsoft SQL Server 默认是支持的)需要隐式转换,以达到快速实现的目的
CREATE FUNCTION pg_catalog.text(integer) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int4out($1));';
CREATE CAST (integer AS text) WITH FUNCTION pg_catalog.text(integer) AS IMPLICIT;
COMMENT ON FUNCTION pg_catalog.text(integer) IS 'convert integer to text';
CREATE FUNCTION pg_catalog.text(bigint) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int8out($1));';
CREATE CAST (bigint AS text) WITH FUNCTION pg_catalog.text(bigint) AS IMPLICIT;
COMMENT ON FUNCTION pg_catalog.text(bigint) IS 'convert bigint to text';

索引

-- 创建索引
CREATE INDEX IF NOT EXISTS {index_name} ON {table_name} USING btree ({column_name}); -- Query the indexes of a table
-- table_name,表名
SELECT * FROM pg_indexes WHERE tablename IN ('{table_name}'); -- 查询所有索引
SELECT
i.relname AS indname ,
i.relowner AS indowner ,
idx.indrelid::REGCLASS ,
am.amname AS indam ,
idx.indkey ,
ARRAY(
SELECT
pg_get_indexdef(idx.indexrelid,
k + 1,
TRUE)
FROM
GENERATE_SUBSCRIPTS(idx.indkey, 1) AS k
ORDER BY
k) AS indkey_names ,
idx.indexprs IS NOT NULL AS indexprs ,
idx.indpred IS NOT NULL AS indpred
FROM
pg_index AS idx
JOIN pg_class AS i ON
i.oid = idx.indexrelid
JOIN pg_am AS am ON
i.relam = am.oid
JOIN pg_namespace AS ns ON
ns.oid = i.relnamespace
AND ns.nspname = ANY (CURRENT_SCHEMAS(FALSE)); -- 查询所有索引,排除系统表
SELECT
U.usename AS user_name,
ns.nspname AS schema_name,
idx.indrelid :: REGCLASS AS table_name,
i.relname AS index_name,
idx.indisunique AS is_unique,
idx.indisprimary AS is_primary,
am.amname AS index_type,
idx.indkey,
ARRAY(
SELECT
pg_get_indexdef(idx.indexrelid,
k + 1,
TRUE)
FROM
GENERATE_SUBSCRIPTS(idx.indkey, 1) AS k
ORDER BY
k ) AS index_keys,
(idx.indexprs IS NOT NULL)
OR (idx.indkey::INT[] @> ARRAY[0]) AS is_functional,
idx.indpred IS NOT NULL AS is_partial
FROM
pg_index AS idx
JOIN pg_class AS i ON
i.oid = idx.indexrelid
JOIN pg_am AS am ON
i.relam = am.oid
JOIN pg_namespace AS NS ON
i.relnamespace = NS.OID
JOIN pg_user AS U ON
i.relowner = U.usesysid
WHERE
NOT nspname LIKE 'pg%';

数据查询和操作

-- 检查不存在则写入
INSERT INTO {table_name}({column_name1} [, {column_name2}, ...])
SELECT {column_value1} [, {column_value2}, ...]
WHERE NOT EXISTS (
SELECT 1 FROM {table_name} WHERE ...
)

权限控制

-- CREATE USER OR ROLE,PostgreSQL 中创建用户和角色是等效的
-- role_name,用户角色名称
-- user_password,用户密码
-- user_name,用户角色名称
CREATE ROLE {role_name} WITH CREATEDB CREATEROLE LOGIN PASSWORD '{user_password}';
CREATE user {user_name} PASSWORD '{user_password}'; -- 分配所有权限
-- database_name,数据库名称
-- database_user,数据库用户
GRANT ALL PRIVILEGES ON {database_name} TO {database_user}; -- 修改表的 Owner
-- table_name,表名
-- database_user,数据库用户
ALTER TABLE {table_name} OWNER TO {database_user}; -- 分配 FUNCTION 的权限给指定用户
-- function_name,函数名称
-- parameter1_type,第一个函数参数类型
-- parameter2_type,第二个函数参数类型
-- database_user,数据库用户
GRANT EXECUTE ON FUNCTION {function_name}([{parameter1_type}, {parameter2_type}, ...]) TO {database_user}; -- 修改 FUNCTION 的 Owner
-- function_name,函数名称
-- parameter1_type,第一个函数参数类型
-- parameter2_type,第二个函数参数类型
-- database_user,数据库用户
ALTER FUNCTION {function_name}([{parameter1_type}, {parameter2_type}, ...]) OWNER TO {database_user};

运行分析

-- 查询当前数据库 TOP 20 大表
SELECT table_name
,pg_size_pretty(pg_relation_size(table_schema || '.' || table_name)) AS size
FROM information_schema.tables
ORDER BY pg_relation_size(table_schema || '.' || table_name) DESC LIMIT 20; -- 查询单个表大小
-- table_name,表名
SELECT pg_size_pretty(pg_relation_size({table_name})); -- 查询数据库活动的查询
SELECT current_timestamp - query_start AS runtime
,query_start
,datname
,pid
,query
FROM pg_stat_activity
WHERE query_start IS NOT NULL
ORDER BY 1 DESC limit 20;

运行维护

-- Check server version
SELECT VERSION(); -- Cancel Processes by pid
SELECT pg_cancel_backend(pid int); -- Terminate Processes by pid
SELECT pg_terminate_backend(pid int); -- Kill all existing connections in the original database
-- source_db,数据库名称
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = '{source_db}'
AND pid <> pg_backend_pid(); -- garbage-collect and optionally analyze a database
-- table_name,数据库表名
VACUUM {table_name};
VACUUM FULL {table_name};

配置

-- 修改 max_locks_per_transaction
ALTER SYSTEM SET max_locks_per_transaction = 300; -- 重载配置信息,使配置生效
-- pg_hba.conf
SELECT pg_reload_conf();

备份还原

# host_name,主机
# database_user,数据库用户
# file_path,备份文件路径
# database_name,数据库名称
pg_dump --host {host_name} --port {port} --username {database_user} --format c --blobs --verbose --file {file_path} {database_name} pg_restore --host {host_name} --port {port} --username {database_user} --no-owner --dbname {database_name} {file_path}

其他

-- Prepare a statement for execution
PREPARE foo(TEXT, TEXT, TEXT) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3
EXECUTE foo('foo', 'bar', 'baz');
DEALLOCATE foo;

时间处理

-- 查询时间差
-- begin_time
-- end_time
SELECT EXTRACT(epoch FROM ({begin_time} - {end_time})); -- Query the last month in format 'YYYYMM'
SELECT to_char(date_trunc('month', current_date - interval '1' month), 'YYYYMM');

psql

# 打开数据库连接
# host_name
# database_user
psql -h {host_name} -U {database_user} # 列出所有的数据库
\l # 连接数据
# database_name
\c {database_name}

File Locations

SHOW data_directory;
SHOW config_file;
SHOW hba_file;

修改记录

  • 2020-04-28 16:26 新增查询服务器版本的 SQL
  • 2020-03-23 21:44 新增数据查询和操作的 SQL
  • 2020-03-17 18:29 新增 File Locations 节点
  • 2020-03-12 23:02 修改备份脚本:增加了 port 参数;将缩写命令改成完整参数命令,便于阅读

常用 PostgreSQL 脚本的更多相关文章

  1. Linux常用Shell脚本珍藏【转载】

    我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本.如何学好脚本,最关键的 ...

  2. 8个DBA最常用的监控Oracle数据库的常用shell脚本

    本文介绍了8个常用的监控数据shell脚本.首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DBA脚本.网上也有好多类似的文章,但基本上都不能正常运行,花点时间重 ...

  3. 常用shell脚本命令

    常用shell脚本命令 1.显示包含文字aaa的下一行的内容: sed -n '/aaa/{n;p;}' filename 2.删除当前行与下一行的内容: sed -i '/aaa/{N;d;}' f ...

  4. windows常用bat脚本

    windows常用bat脚本 https://blog.csdn.net/longyan_csc/article/details/78737722 Windows_批处理+任务计划实现文件夹定时备份 ...

  5. 使用PostgreSQL 脚本导出数据库的DDL

    使用PostgreSQL 脚本导出数据库的DDL 本文主要介绍如何使用基于 PostgreSQL pgdump编写的自定义脚本来导出数据库的DDL. 一.文件说明: 1.pgdump基础语句.sql: ...

  6. jquery.validate使用 - 常用验证脚本

    一些常用的验证脚本 不会写js了,只能从网上找一些常用的验证脚本. // 手机号码验证jQuery.validator.addMethod("mobile", function(v ...

  7. spring boot 以jar的方式启动常用shell脚本

    用spring boot框架做的项目,将第三方包全部打在jar里面,通过shell脚本启动和停止服务,常用的shell脚本模板如下: #!/bin/bashJAVA_OPTIONS_INITIAL=- ...

  8. Linux之常用Shell脚本总结

    一.简介本文将总结一些常用的shell脚本,方便以后工作中使用. 二.shell脚本[a]定期备份mysql数据库,需结合cronb定时任务调度实现. #!/bin/bash#首先声明一些自定义变量 ...

  9. linux 常用Mysql脚本命令

    常用命令 无需系统Root权限 新数据库设置Root密码 visible > mysql -uroot -p visible > mysqladmin -uroot password &q ...

随机推荐

  1. [JLOI2014]松鼠的新家(树链剖分)

    [JLOI2014]松鼠的新家(luogu) Description 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...

  2. python HelloWorld 的 4 种姿势,你知道几种

    安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...

  3. NVIDIA DRIVE

      NVIDIA 驱动安装(超详细) ref1: https://blog.csdn.net/qlulibin/article/details/78714596 ref2:https://www.cn ...

  4. win10打开相机提示我们找不到你的相机

  5. Shiro Web集成及拦截器机制(四)

    Shiro与 Web 集成 Shiro 提供了与 Web 集成的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的 URL,然后进行相应的控制,ShiroFilter 类似于如 Str ...

  6. 1233: 输出杨辉三角前n行

    #include <stdio.h> int main() { int n,i,j,ch[15][15],v,k; char *nl = ""; while(scanf ...

  7. 利用AppMetrics对Web进行监控教程

    利用AppMetrics对Web进行监控教程 一.基础准备 1. 安装依赖 这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本): Install-Package App.M ...

  8. 源码级别gdb远程调试(实现OS简单内核)

    最近在学着编写一个操作系统的简单内核,需要debug工具,我们这里使用gdb来进行调试,由于虚拟机运行和本机是两个部分,所以使用 gdb 的远程调试技术,这里对 gdb 常见调试以及远程调试方式做一个 ...

  9. 制作ASCII字符动画

    看过Matrix的同学应该还记得,在母舰上一直在计算的电脑屏幕在Neo觉醒的时候,不停的下落的杂乱无章的字符组成了Neo当时所处的场景.其实利用开源和免费的工具,我们可以将现有的视频转换为ASCII字 ...

  10. Codeforces_512_B

    http://codeforces.com/problemset/problem/512/B dp题,因为状态很多,所以用map保存,注意代码中的那个二层循环不能内外换,因为map会自动排序. #in ...