PostgreSQL表全解

文章目录

  • 一、 约束
    • 1、 主键
    • 2、 非空
    • 3、唯一
    • 4、检查
    • 5、外键
    • 6、默认值
  • 二、触发器
    • 1、构建表信息,填充数据
    • 2、触发器函数
    • 3、触发器
  • 三、 表空间
  • 四、 视图
  • 五、索引
    • 1、 索引的基本概念
    • 2、索引的分类
    • 3、创建索引
  • 六、 物化视图

一、 约束

1、 主键

primary key

-- 主键约束
drop table test;
create table test(
    id bigserial primary key,
    name varchar(32)
);

2、 非空

not null,基本都要,避免全表扫描

-- 非空约束
drop table test;
create table test(
    id bigserial primary key ,
    name varchar(32) not null
);

3、唯一

unique

drop table test;
create table test(
    id bigserial primary key ,
    id_card varchar(32) unique
);

4、检查

check

drop table test;
create table test(
    id bigserial primary key,
    price numeric check(price > 0),
    discount_price numeric check(discount_price > 0),
    check(price >= discount_price)
);

5、外键

基本不用

6、默认值

default

-- 默认值
create table test(
    id bigserial primary key,
    created timestamp default current_timestamp
);

二、触发器

触发器Trigger,是由事件触发的一种存储过程。
创建时指定的事件(insert,update,delete,truncate表),当对表进行相关操作时,会触发表的Trigger。

案例:学生信息表,学生分数表,在删除学生信息的同时,自动删除学生的分数。

1、构建表信息,填充数据

create table student(
    id int,
    name varchar(32)
);
create table score(
    id int,
    student_id int,
    math_score numeric,
    english_score numeric,
    chinese_score numeric
);

INSERT INTO student (id,name) values (1,'张三');
INSERT INTO student (id,name) values (2,'李四');
INSERT INTO score ( ID, student_id, math_score, english_score, chinese_score )
VALUES( 1, 1, 66, 66, 66 );
INSERT INTO score ( ID, student_id, math_score, english_score, chinese_score )
VALUES( 2, 2, 55, 55, 55 );

2、触发器函数

PostgreSQL的plsql语法

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
END [ label ];

触发器函数的一些特殊变量

NEW,数据类型是RECORD。该变量为行级触发器中的INSERT/UPDATE操作保持新数据行。在语句级别的触发器以及DELETE操作,这个变量是null。
OLD,数据类型是RECORD。该变量为行级触发器中的UPDATE/DELETE操作保持新数据行。在语句级别的触发器以及INSERT操作,这个变量是null。

构建一个删除学生分数的触发器函数

-- $$可以理解为是一种特殊的单引号,避免你在declare,begin,end中使用单引号时,出现问题,
-- 需要在编写后,在$$之后添加上当前内容的语言。
create function trigger_function_delete_student_score() returns trigger as $$
begin
    delete from score where student_id = old.id;
    return old;
end;
$$ language plpgsql;

3、触发器

开始构建触发器,在学生信息表删除时,执行前面声明的触发器函数

CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

CONSTRAINT选项被指定,这个命令会创建一个 约束触发器 。这和一个常规触发器相同,不过触发该触发器的时机可以使用SET CONSTRAINTS调整。约束触发器必须是表上的 AFTER ROW触发器。它们可以在导致触发器事件的语句末尾被引发或者在包含该语句的事务末尾被引发。在后一种情况中,它们被称作是被 延迟 。一个待处理的延迟触发器的引发也可以使用 SET CONSTRAINTS立即强制发生。当约束触发器实现的约束被违背时,约束触发器应该抛出一个异常。
编写触发器,指定在删除某一行学生信息时,触发当前触发器,执行触发器函数

create trigger trigger_student 
after 
delete 
on student 
for each row 
execute function trigger_function_delete_student_score();

测试效果

select * from student;
select * from score;
delete from student where id = 1;

三、 表空间

在存储数据时,数据肯定要落到磁盘上,基于构建的tablespace,指定了数据存放在磁盘上的物理地址。
如果没有自己设计tablespace,PostgreSQL会自动指定一个位置作为默认的存储点。

查询表存储的物理地址

select pg_relation_filepath('student');

在这里插入图片描述
上面这个地址是$PG_DATA下的地址,不太好管理,后面需要自己指定。32772其实就是存储数据的物理文件。

$PG_DATA == /var/lib/pgsql/12/data/

构建表空间,指定数据存放位置
image.png
构建表空间,构建表空间需要用户权限是超级管理员,其次需要指定的目录已经存在

create tablespace tp_test location '/var/lib/pgsql/12/tp_test';

image.png
构建数据库,以及表,指定到这个表空间中
image.png
指定表空间的存储位置后,PGSQL会在$PG_DATA目录下存储一份,同时在咱们构建tablespace时,指定的路径下也存储一份。

这两个绝对路径下的文件都有存储表中的数据信息。

/var/lib/pgsql/12/data/pg_tblspc/41015/PG_12_201909212/41016/41020
/var/lib/pgsql/12/lz_tp_test/PG_12_201909212/41016/41020

细心发现,其实在PostgreSQL的默认目录下,存储的是一个link,连接文件,类似一个快捷方式
image.png

四、 视图

跟MySQL的没啥区别,把一些复杂的操作封装起来,还可以隐藏一些敏感数据。
视图对于用户来说,就是一张真实的表,可以直接基于视图查询一张或者多张表的信息。
视图对于开发来说,就是一条SQL语句。
image.png
在PGSQL中,简单(单表)视图是允许写操作的。但强烈不推荐对视图进行写操作,虽然PGSQL默认允许(简单视图),因为写入的时候,其实修改的是表本身。

简单视图

create view vw_score as (select id,math_score from score);

复杂视图(多表视图)

-- 复杂视图(两张表关联)
create view vw_student_score as 
(select stu.id as id ,stu.name as name ,score.math_score from student stu,score score where stu.id = score.student_id);

五、索引

1、 索引的基本概念

索引是数据库中快速查询数据的方法。
索引能提升查询效率的同时,也会带来一些问题

  • 增加了存储空间
  • 写操作时,花费的时间比较多

索引可以提升效率,甚至还可以给字段做一些约束

2、索引的分类

B-Tree索引:最常用的索引。
Hash索引:跟MySQL类似,做等值判断,范围不支持。
GIN索引:针对字段的多个值的类型,比如数组类型。

3、创建索引

image.png

准备测试数据

create table tb_index(
    id bigserial primary key,
    name varchar(64),
    phone varchar(64)[]
);

-- 添加300W条数据测试效果
do $$
declare
    i int := 0;
begin
    while i < 3000000 loop
        i = i + 1;
        insert into
            tb_index
        (name,phone) 
            values
        (md5(random()::text || current_timestamp::text)::uuid,array[random()::varchar(64),random()::varchar(64)]);
    end loop;
end;
$$ language plpgsql;

在没有索引的情况下,先基于name做等值查询,时间0.3秒左右,同时看执行计划,Seq Scan 这个代表全表扫描

select * from tb_index where name = 'c0064192-1836-b019-c649-b368c2be31ca';
explain select * from tb_index where name = 'c0064192-1836-b019-c649-b368c2be31ca';

在有索引的情况下,再基于name做等值查询,时间 0.1s左右,同时看执行计划,Index Scan 使用索引

-- name字段构建索引(默认就是b-tree)
create index index_tb_index_name on tb_index(name);
-- 测试效果
select * from tb_index where name = 'c0064192-1836-b019-c649-b368c2be31ca';
explain select * from tb_index where name = 'c0064192-1836-b019-c649-b368c2be31ca';

测试GIN索引效果
在没有索引的情况下,基于phone字段做包含查询,查询时间0.5s左右,同时看执行计划,Seq Scan 全表扫描

-- phone:{0.6925242730781953,0.8569644964711074}
select * from tb_index where phone @> array['0.6925242730781953'::varchar(64)];
explain select * from tb_index where phone @> array['0.6925242730781953'::varchar(64)];

给phone字段构建GIN索引,查询时间0.1s以内,同时看执行计划,Bitmap Index 位图扫描

-- 给phone字符串数组类型字段构建一个GIN索引
create index index_tb_index_phone_gin on tb_index using gin(phone);
select * from tb_index where phone @> array['0.6925242730781953'::varchar(64)];
explain select * from tb_index where phone @> array['0.6925242730781953'::varchar(64)];

六、 物化视图

物化视图从名字上就可以看出来,必然是要持久化一份数据的。使用套路和视图基本一致。查询物化视图,就相当于查询一张单独的表。相比之前的普通视图,物化视图就不需要每次都查询复杂SQL,每次查询的都是真实的物理存储地址中的一份数据(表)。

物化视图因为会持久化到本地,完全脱离原来的表结构,而且物化视图是可以单独设置索引等信息来提升物化视图的查询效率。

坏处:更新时间不太好把控。 如果更新频繁,对数据库压力也不小。 如果更新不频繁,会造成数据存在延迟问题,实时性就不好了。

如果要更新物化视图,可以采用触发器的形式,当原表中的数据被写后,可以通过触发器执行同步物化视图的操作。或者就基于定时任务去完成物化视图的数据同步。

语法
image.png
构建物化视图

create materialized view mv_test as (select id,name,price from test);

操作物化视图和操作表的方式没啥区别,操作原表时,对物化视图没任何影响。

select * from mv_test;

不允许写物化视图,物化视图如何从原表中进行同步操作。
PostgreSQL中,对物化视图的同步,提供了两种方式,一种是全量更新,另一种是增量更新。

全量更新语法,没什么限制,直接执行,全量更新

-- 查询原来物化视图的数据
select * from mv_test;
-- 全量更新物化视图
refresh materialized view mv_test;
-- 再次查询物化视图的数据
select * from mv_test;

增量更新,增量更新需要一个唯一标识,来判断哪些是增量,同时也会有行数据的版本号约束。

-- 查询原来物化视图的数据
select * from mv_test;
-- 增量更新物化视图,因为物化视图没有唯一索引,无法判断出哪些是增量数据
refresh materialized view concurrently mv_test;
-- 给物化视图添加唯一索引。
create unique index index_mv_test on mv_test(id);
-- 增量更新物化视图
refresh materialized view concurrently mv_test;
-- 再次查询物化视图的数据
select * from mv_test;

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

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

相关文章

粒子群优化pso结合bp神经网络优化对csv文件预测matlab(3)

1.csv数据为密西西比数据集&#xff0c;获取数据集可以管我要&#xff0c;数据集内容形式如下图&#xff1a; 2.代码 这里参考的是b站的一位博主。 数据集导入教程在我的另一篇文章bp写过&#xff0c;需要的话可以去看一下 psobp.m close all clc%读取数据 inputX; outputY;…

无边界支付:数字货币如何改变跨境电商?

在全球数字化的浪潮中&#xff0c;数字货币的崛起成为跨境电商领域的一场革命。本文将深入探讨数字货币如何重新定义支付体系&#xff0c;对跨境电商带来的影响以及未来可能的发展方向。 数字货币的崛起 随着比特币等数字货币的逐渐走俏&#xff0c;传统支付体系的边界逐渐被打…

c语言结构体学习上篇

文章目录 前言一、结构体的声明1&#xff0c;什么叫结构体?2&#xff0c;结构体的类型3,结构体变量的创建和初始化4&#xff0c;结构体的类型5&#xff0c;结构体的初始化 二、结构体的访问1&#xff0c;结构体成员的点操作符访问2&#xff0c;结构体体成员的指针访问 前言 昨…

基于RetinaFace+Jetson Nano的智能门锁系统——第二篇(配置环境)

文章目录 设备一、安装远程登录终端Xshell1.1下载Xshell1.2新建回话1.3查询ip地址1.4启动连接 二、安装远程文件管理WinScp2.1下载WinScp2.2连接Jetson Nano2.3连接成功 三、安装远程桌面VNC Viewer3.1下载VNC Viewer3.2在Jetson Nano安装VNC Viewer3.3设置VINO登录选项3.4将网…

工具变量-ESG基金持股数据集(2008-2022年)

一、数据介绍 数据名称&#xff1a;工具变量-ESG基金持股数据 数据范围&#xff1a;A股上市公司 数据年份&#xff1a;2008-2022年 样本数量&#xff1a;41621条 数据来源&#xff1a;中国责任投资年度报告、上市公司年报 数据整理&#xff1a;自主整理 二、参考文献 […

C#中字母与ASCⅡ码的转换

目录 一、关于ASCⅡ及与字符互转 1.主要用到Encoding对象的GetBytes方法 2.Char显式转换为数值类型得到ASCⅡ 二、实例 三、生成效果 四、程序中的一些知识点 1.IsLetterOrDigit() 2.GetBytes() 3.TryParse(string, out int) 一、关于ASCⅡ及与字符互转 ASCⅡ(Americ…

【SpringBoot3】1.SpringBoot入门的第一个完整小项目(新手保姆版+教会打包)

目录 1 SpringBoot简单介绍1.1 SpringBoot是什么1.2 主要优点1.3 术语1.3.1 starter&#xff08;场景启动器&#xff09; 1.4 官方文档 2 环境说明3 实现代码3.1 新建工程与模块3.2 加入依赖3.3 主程序文件3.4 业务代码3.5 运行测试3.6 部署打包3.7 命令行运行 1 SpringBoot简单…

YoloV7改进策略:AAAI 2024 最新的轴向注意力|即插即用,改进首选|全网首发,包含数据集和代码,开箱即用!

摘要 https://arxiv.org/pdf/2312.08866.pdf 本文提出了一种名为Multi-scale Cross-axis Attention(MCA)的方法,用于解决医学图像分割中的多尺度信息和长距离依赖性问题。该方法基于高效轴向注意力,通过计算两个平行轴向注意力之间的双向交叉注意力,更好地捕获全局信息。…

Windows安装部署nginx

1、官网下载安装包&#xff1a; 官网地址&#xff1a;https://nginx.org/en/download.html 下载好后&#xff0c;解压即可&#xff1a; 在nginx的配置文件是conf目录下的nginx.conf&#xff0c;默认配置的nginx监听的端口为80&#xff0c;如果本地80端口已经被使用则修改成其…

强大的Git客户端 GitKraken 中文 for Mac

GitKraken提供了直观的图形化界面&#xff0c;让用户可以轻松地进行版本控制操作&#xff0c;而无需使用命令行界面。您可以通过可视化的工作区、分支图和提交历史&#xff0c;更清晰地了解代码的状态和演变。 跨平台支持&#xff1a;GitKraken可在多个操作系统上运行&#xf…

k8s之Pod的基础(上)

什么是pod&#xff1f; pod是k8s中最小的资源管理组件 pod也是最小运行容器化的应用的资源管理对象 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器时最常用的方式 在一个pod当中同时运行多个容器&#xff0c;在一个po…

Docker之镜像上传和下载

目录 1.镜像上传 1) 先上百度搜索阿里云 点击以下图片网站 2) 进行登录/注册 3) 使用支付宝...登录 4) 登录后会跳转到首页->点击控制台 5) 点击左上角的三横杠 6) 搜索容器镜像关键词->点击箭头所指 ​ 编辑 7) 进入之后点击实例列表 8) 点击个人实例进入我们的一个…

凯越510X ADV欧洲上市,售价5.5万

凯越510X其实并不是一台新车&#xff0c;就是国内上市的双摇臂版本的525X&#xff0c;国内售价33900元&#xff0c;不过国外上市只有一个色&#xff0c;就是下方蓝黑灰的颜色&#xff0c;这个配色方案感觉还不错。 凯越525X作为国产中量级ADV3剑客&#xff0c;口碑销量一直都是…

Linux | 分布式版本控制工具Git【版本管理 + 远程仓库克隆】

文章目录 一、前言二、有关git的相关历史介绍三、Git版本管理1、感性理解 —— 大学生实验报告2、程序员与产品经理3、张三的CEO之路 —— 版本管理工具的诞生 四、如何在Linux上使用Git1、创建仓库2、将仓库克隆到本地3、git三板斧① git add② git commit③ git push 4、有关…

放弃努力必然下滑的2024

知道和做到&#xff0c;这其中有一道鸿沟。 努力不一定会成功&#xff0c;但是不努力连成功的概率都不会有。 问题 之前有朋友看过我的一些博文&#xff0c;问:"我如果不坚持写&#xff0c;仅靠存量能否维持一段时间&#xff1f;" "我如果不坚持写&#xff0c…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为&#xff1a;一&#xff0c;保持生态系统活力和内外部组分、结构的稳定与持续性&#xff1b;二&#xff0c;维持生态系统生态功能的完整性&#xff1b;三&#xff0c;面临外来不利因素时&#xff0c;生态系统具…

3 - 字段约束|MySQL索引|MySQL用户管理

字段约束&#xff5c;MySQL索引&#xff5c;MySQL用户管理 字段约束主键外键 MySQL索引索引介绍优缺点索引使用规则索引的分类索引的管理 用户管理用户授权权限撤销 用户权限追加user表的使用 字段约束 设置在表头上&#xff0c;用来限制字段赋值 包括&#xff1a; 是否允许给…

Edge浏览器的卸载(一分钟版)

一分钟看完不耽误 开整工具下载后 结尾 开整 工具 Remove-MS-Edge 看名字&#xff0c;简单直接 CSDN下载 资源设置是免费的&#xff0c;大家尽管下载 不放心软件安全的话&#xff0c;自己上github地址下载也行 下载后 解压之后 我们打开有gui的&#xff0c;也就是有界面的&…

深度学习MLP_实战演练使用感知机用于感情识别_keras

目录 &#xff08;1&#xff09;why deep learning is game changing?&#xff08;2&#xff09;it all started with a neuron&#xff08;3&#xff09;Perceptron&#xff08;4&#xff09;Perceptron for Binary Classification&#xff08;5&#xff09;put it all toget…

webpack 5 loader

webpack 本身不能识别js&#xff0c;json外的资源&#xff0c;所以我们需要借助其他loader来处理对应的文件 CSS Loader&#xff0c;处理css 安装 npm i css-loader style-loader -D css-loader 负责讲css编译成webpack能识别的模块内容style-loader 动态创建<style&g…
最新文章