03:PostgreSQL逻辑结构(表空间、数据库、模式、表、索引)

环境规划:

  • 操作系统:CentOS 7.9 64bit
  • PostgreSQL 版本:16.x 或 15.x
  • 安装用户:postgres
  • 软件安装目标路径:/usr/pgsql-<version>
  • 数据库数据目录:/pgdata

目录

表空间Tablespace

  默认表空间

  手动创建的表空间

实例/Database/Schema/对象关系

数据库Database

  默认数据库

  手动创建的数据库

模式Schema

  默认Schema 

  模式搜索路径search_path

  删除public模式

  建议对template1中删除public模式

表Table 

  表创建、插入、删除

  表结构复刻

  临时表

  UNLOGGED表

索引Index 


本文假设已经掌握SQL基本语法和数据库基础概念。因此只简明扼要介绍PostgreSQL的逻辑结构。

表空间Tablespace

  默认表空间

数据库初始化之后自动会创建pg_default和pg_global两个表空间(pg_tablespace视图查看,也可以通过在psql中使用“\db+”查看)。

  • pg_default表空间:是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录$PADATA/base/  (template0、template1和postgres数据库存放在pg_default表空间下)
  • pg_global表空间:用来存放系统字典表,共享系统目录;对应存储目录$PADATA/global/。相当于oracle数据库的system表空间

  手动创建的表空间

1、为表空间创建存放目录($PGDATA在本环境为/pgdata),在数据库服务器操作系统中以postgres用户执行:

mkdir -p $PGDATA/pg_tblspc/tbs_user1

 2、创建表空间。在psql中执行语句:

CREATE TABLESPACE tbs_user1 LOCATION  '/pgdata/pg_tblspc/tbs_user1';

创建tablespace的其他option选型,请参考官方文档。

实例/Database/Schema/对象关系

在PostgreSQL中,这几者之间关系为:

PG数据库服务(实例)

      └ database1

            └ schemaA

                   └ table_T1

                   └ table_T2

                   └ view_V1

            └ schemaB

      └ database2

            └ schemaA

            └ schemaB

      └ database3

            └ schemaA

            └ schemaB

PG数据库服务(实例)中可以有多个数据库(database),在psql工具中可以通过\c切换所连接的库。每个数据库下有不同的shema、每个schema下有不同的对象。

  • MySQL没有上图中数据库概念,只有上图的schema(在MySQL中schema也称为database,实际应为schema)
  • 在Oracle中,用户与Schema是绑定对应的,一个用户就是一个Schema。

数据库Database

  默认数据库

数据库初始化之后自动会创建postgres、template0、template1三个数据库。

  • postgres数据库:这是默认的管理数据库,用于管理 PostgreSQL 服务器和用户角色。它包含了用于管理服务器和用户的系统表,例如 pg_roles、pg_database 等。通常不建议用于存储实际数据,而仅用于管理目的。
  • template0数据库:这是一个空模板数据库,改模版非常“干净”,且不可修改。可用于创建其他数据库的模板。。
  • template1数据库:与 template0 类似,也是一个模板数据库,可用于创建其他数据库的模板。但与 template0 不同的是,template1 是可以被修改的,比如修改模版字符集、或者可以在其中创建用户自定义的对象,例如函数、表等。默认情况,我们新创建database会以template1库为模板进行创建。

  手动创建的数据库

在psql中执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该库的owner,默认使用template1模板
CREATE DATABASE userdb;

--(推荐)指定其中该库的owner、模板、字符编码、表空间。
CREATE DATABASE userdb OWNER user_zyp TEMPLATE template0 ENCODING 'UTF8' TABLESPACE tbs_user1;

更多option选型,请参考官方文档。 

模式Schema

  默认Schema 

创建数据库时会自动会创建information_schema、pg_catalog、pg_toast、public四个模式。

手动创建的模式schema,在psql中(先连接至某个数据库)执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该模式的owner
CREATE SCHEMA 模式名;

--(推荐)指定模式owner
CREATE SCHEMA 模式名 AUTHORIZATION 角色名/用户名;

--修改已有模式名
ALTER SCHEMA 模式名 RENAME TO 新模式名;

--修改已有模式的owner
ALTER SCHEMA 模式名 OWNER TO 角色名/用户名;

更多option选型,请参考官方文档。 

查看对象所属模式:

查看表所属模式
SELECT table_schema, table_name FROM information_schema.tables;

查看视图所属模式
SELECT table_schema, table_name FROM information_schema.views;

查看存储过程、函数所属模式
SELECT specific_schema, specific_name FROM information_schema.routines;

查看序列所属模式
SELECT sequence_schema, sequence_name FROM information_schema.sequences;

查看触发器所属模式
SELECT trigger_schema, trigger_name FROM information_schema.triggers;

  模式搜索路径search_path

由于存在多个模式,PostgreSQL提供了模式搜索路径(类似Linux中的PATH环境变量)来查找数据库中各对象。若语句中没有显示指定schema,则从search_path中存的模式列表中搜索:

  • 查找某个对象(表、视图、函数、索引等):则从search_path中左至右搜索,若在某模式下可找到对象,则以该模式下的对象作为选中对象。若遍历所有模式均未找到,则报不存在该对象Did not find any.......。
  • 若需要创建对象,则从search_path中左至右搜索,若某个模式存在且当前用户对该模式具有CREATE权限(Owner永远有创建权限),则以该模式作为新创建对象的所属模式。

查看和修改模式搜索路径search_path:

--查看
SHOW search_path;

--修改(当前会话级别)
SET search_path TO "$user", public;

--修改(数据库级别,重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user", public;

--修改(用户级别,重新登录后生效)
ALTER ROLE 角色名/用户名 SET search_path TO "$user", public;

search_path中:$user 表示模式名等于当前用户名,既仅在当前用户名与schema同名才能匹配上。

  删除public模式

PostgreSQL中每个database都默认存在public模式,而public不是SQL标准概念,在其他数据库软件中也不存在public模式。

因此,为了最大程度兼容,并考虑可一致性,强烈建议删除public模式不使用

若经评估不适合删除public模式,为避免不小心误将对象创建public模式下,至少应撤销在public模式下创建对象权限,命令参考如下

--默认:所有用户对public模式具有CREATE和USAGE权限。
--撤销在public模式下创建对象权限。第一个public指模式名,第二个PUBLIC表示所有用户
REVOKE CREATE ON SCHEMA public FROM PUBLIC;

--以超级用户,修改所有用户的search_path,去除public(重新登录后生效)
ALTER ROLE ALL SET search_path TO "$user";

--修改数据库,去除public(重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user";

--删除模式
DROP SCHEMA public;

  建议对template1中删除public模式

建议将template1模板中的public模式删除,这样使用template1模板在新创建数据库时,新库就不再有public模式

--连接
\c template1;

--修改数据库,去除public
ALTER DATABASE template1 SET search_path TO "$user";

--删除模式
DROP SCHEMA public;

表Table 

  表创建、插入、删除

略。

注意:在PostgreSQL更新一条数据,源数据并不会覆盖,而是会插入一条新的数据。

  表结构复刻

CREATE TABLE 新表名 (LIKE 母表 like_option)

like_option常见的:
   INCLUDING COMMENTS
   INCLUDING COMPRESSION
   INCLUDING CONSTRAINTS
   INCLUDING DEFAULTS
   INCLUDING GENERATED
   INCLUDING IDENTITY
   INCLUDING INDEXES --新的索引名为:新表名_涉及字段名_idx
   INCLUDING STATISTICS
   INCLUDING STORAGE
   INCLUDING ALL

CREATE TABLE LIKE:以母表为源复刻表结构,不涉及数据。

CREATE TABLE AS: 以select结果集创建表并fill填充数据

  临时表

CREATE TEMPORARY TABLE tb_tmp_t1 (name varchar(32));

\d+ tb_tmp_t1;

  • 临时表分为两种:会话级别、事务级别。在创建临时表语句增加ON COMMIT选型来区分。
  • 临时表在会话结束后,表即会消失(表数据和表结构均会消失)
  • 临时表所属的schema为特殊schema,名字为pg_temp_N (不同的会话N不同)

  UNLOGGED表

CREATE UNLOGED TABLE tb_unlogged_t01 (name varchar(32));

 UNLOGGED表不会写WAL日志,无法实现主备库之间同步(在主库机器上会存储该表),使用上与普通表没有区别。UNLOGGED在插入/删除/更新性能会略高。

索引Index 

略。

PostgreSQL支持在创建索引是通过选项CONCURRENTLY进行并发创建索引,避免在创建过程中阻塞对表的插入/删除/更新操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins--从入门到入土

Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土〇、概念提要--什么是CI/DI&#xff1f;1、CI&#xff08;Continuous Integration&#xff0c;持续集成&#xff09;2、DI&#xff08;DevOps Integration&#xff0c;DevOps 集成&#xff09;3、解决的问题 一、Jenkins安…

【代码随想录】【算法训练营】【第20天】 [654]最大二叉树 [617]合并二叉树 [700]二叉搜索树中的搜索 [98]验证二叉搜索树

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 19&#xff0c;一个愉快的周日~ day 20&#xff0c;一个悲伤的周一~ 题目详情 [654] 最大二叉树 题目描述 654 最大二叉树 解题思路 前提&#xff1a;构造二叉树 思路&#xff1a;寻找根节…

基于Django框架的项目搭建后台首页

(1). 创建数据库 osdb 进入MySQL数据库中&#xff0c;创建一个数据库名为&#xff1a;osdb 通过数据表结构来创建数据表&#xff1a; -- 员工信息表 CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 员工账号id,username varchar(50) DEFAULT NULL C…

路径规划 | 图解粒子群(PSO)算法(附ROS C++仿真)

目录 0 专栏介绍1 从鸟群迁徙说起2 粒子群算法基本概念3 粒子群算法流程4 粒子群算法ROS实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#xff1b;局部规…

跨境热销爆款货源哪里找?选品工具不能少

通常&#xff0c;跨境电商找热销货源的几种方法&#xff1a; 1、使用Google Trends、亚马逊销售排行等来追踪和分析当前的市场趋势和热门产品&#xff1b; 2、关注社交媒体、行业论坛和博客等渠道&#xff0c;以获取最新的市场信息和消费者反馈&#xff1b; 3、在主流的跨境…

Oracle实践|内置函数之数学型函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

CDC 数据实时同步入湖的技术、架构和方案(截至2024年5月的现状调研)

近期&#xff0c;对 “实时摄取 CDC 数据同步到数据湖” 这一技术主题作了一系列深入的研究和验证&#xff0c;目前这部分工作已经告一段落&#xff0c;本文把截止目前&#xff08;2024年5月&#xff09;的研究结果和重要结论做一下梳理和汇总。为了能给出针对性的技术方案&…

基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)

癫痫是一种由大脑神经元突发性异常放电导致的大脑功能性障碍疾病。据世界卫生组织统计&#xff0c;全球约有7000万人患有癫痫。癫痫患者在发病时呈现肌肉抽搐、呼吸困难、意识丧失等症状。由于癫痫发作的偶然性&#xff0c;患者极有可能在高空、驾驶、游泳等危险情况下发病并丧…

掌握栈回溯意味着什么?

来源&#xff1a;公众号【鱼鹰谈单片机】 作者&#xff1a;鱼鹰Osprey ID &#xff1a;emOsprey 历时两个月&#xff08;1/3&#xff09;&#xff0c;第一个完成电子表项目的学员出现了&#xff0c;并且顺利的掌握了栈回溯技巧&#xff0c;在工作中快速定位了一个任务异常挂起…

【STM32】 独立看门狗配置方法

什么是看门狗 看门狗&#xff08;watchdog&#xff09;指的是一种监控系统或程序&#xff0c;用于定期检测和监控其他系统或程序的运行状态&#xff0c;并在出现问题或故障时采取相应的措施。它可以是硬件设备&#xff0c;也可以是软件程序。 在计算机领域中&#xff0c;看门狗…

全国青少年信息素养大赛历届复赛、国赛真题

由于2024年信息素养大赛初赛比较简单&#xff0c;特别是Scrath图形化编程和Python编程&#xff0c;八九分钟及半个小时内交卷的也多&#xff0c;100分及80分以上的比较多&#xff0c;&#xff08;各赛区复赛晋级根据两个指标进行排名&#xff0c;初赛成绩和答题用时。首先根据分…

AC/DC电源模块:提供高质量的电力转换解决方案

BOSHIDA AC/DC电源模块&#xff1a;提供高质量的电力转换解决方案 AC/DC电源模块是一种电力转换器件&#xff0c;可以将交流电转换为直流电。它通常用于各种电子设备和系统中&#xff0c;提供高质量的电力转换解决方案。 AC/DC电源模块具有许多优点。首先&#xff0c;它能够提…

玩机进阶教程------固件中的分区表 gpt_backup0.bin gpt_both0.bin gpt_main0.bin有什么区别 怎么修改分区表【一】

不管是emmc还是ufs在官方的线刷包中都有分区表存在。分区表包含有各个分区的地址段落。如果你在fast模式刷入官方固件还解决不了系统问题。那有几率是分区表损坏。这种情况无论你怎么刷写分区是解决不了问题的。 此类话题在百度很难搜索到,大多都是讲分区表的类型 结构 等等,…

23种设计模式全面总结 | 快速复习(附PDF+MD版本)

本篇文章是对于23种设计模式的一个全面的总结&#xff0c;受限于文章篇幅无法对每个设计模式做到全面的解析&#xff0c;但几乎每个设计模式都提供了案例和类图结构&#xff0c;非常适合快速复习和在学习设计模式之前的全预习把握。 &#x1f4a1;文章的 pdf markdown 版本可通…

驱动开发执行应用层时报ELF: not found,syntax error: unexpected “(“错误

问题&#xff1a; 原因&#xff1a;在跨平台的时候注意我们使用的编译器&#xff0c;我是因为没有没有交叉编译导致的。 出问题之前使用的是gcc test_01_normal.c -o test_01_normal生成的文件&#xff0c;导致&#xff0c;执行时报ELF这种问题。 解决办法&#xff1a;arm-li…

将本地项目上传到 gitee 仓库

1、创建 gitee 仓库 到 gitee 官网&#xff0c;新建仓库 配置新建仓库 完成仓库的创建 项目上传到仓库 上传项目需要安装git git官方下载地址&#xff1a;git下载地址 安装完成&#xff0c;前往本地项目所在文件夹&#xff0c;右击选择 Git Bash Here 刚下载完成需要配置G…

粤嵌—2024/5/13—删除排序链表中的重复元素(✔)

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* deleteDuplicates(struct ListNode *head) {if (head NULL || head->next NULL) {return head;}struct ListNode *…

【计算机毕业设计】基于SSM+Vue的新能源汽车在线租赁管理系统【源码+lw+部署文档】

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;新能源汽车在线租赁当然也不能排除在外。新能源汽车在线租赁是以实际运用为开发背景&#xff0c;运用软件工程开发方法&…

【Linux部署】【pig前端部署】Linux安装- docker/docker-compose/nginx (使用docker优雅部署nginx)

&#x1f338;&#x1f338; Linux安装- docker/docker-compose/nginx 优雅部署 &#x1f338;&#x1f338; 一、一键安装jdk yum install -y java-1.8.0-openjdk.x86_64验证 二、安装docker yum list docker-ce --showduplicates | sort -rsudo yum install -y yum-utils …

Visual Studio和Visual Studio Code分清了? 都是IDE,可不是框架。

Visual Studio和VSCode两者都是 Microsoft 制造的IDE&#xff08;集成开发环境&#xff09;。尽管它们的名字相似&#xff0c;但它们的功能却大不相同。 一、什么是Visual Studio&#xff08;VS&#xff09; Visual Studio&#xff08;简称VS&#xff09;是由微软公司开发的一…