【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计

  • 基本配置
  • 一、序列
    • 1.1、序列使用
      • 1.1.1、设置字段为主键,数据类型默认整型
      • 1.1.2、自定义序列,数据类型自定义
    • 1.2、序列延申
      • 1.2.1、理论
      • 1.2.2、测试
      • 1.2.3、小结
  • 二、函数
    • 2.1、SQL直接创建
      • 2.1.1、理论
      • 2.1.2、测试
    • 2.2、借用DBeaver创建
  • 三、视图
    • 3.1、SQL语句
    • 3.2、示例
  • 四、触发器
    • 4.1、SQL语句
      • 4.1.1、触发器函数
      • 4.1.2、函数与表关联
    • 4.2、示例

基本配置

数据库管理工具:DBeaver23.2.3
PostgreSQL 14.6
测试数据库在博文中已经资源绑定分享

一、序列

1.1、序列使用

在MySQL数据库中,实现主键自增,只需要设置字段为主键即可,但在Pg数据库中却有所不同。
实现的途径主要有2种:

1.1.1、设置字段为主键,数据类型默认整型

此时字段默认为serial4,即自增 4 字节整数,范围1 到 2147483647。以表employees_history为例,主键字段id默认值为nextval(‘employees_history_id_seq’::regclass),同时会自动添加序列employees_history_id_seq
函数 nextval(regclass) 返回类型bigint,描述如下:

递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。

1.1.2、自定义序列,数据类型自定义

当主键数据类型不是整型时,使用序列自增主要采用该种方法。
首先,用SQL语句创建testseq_d_seq序列:

CREATE SEQUENCE public.testseq_d_seqINCREMENT BY 1MINVALUE 1MAXVALUE 2147483647START 1CACHE 1NO CYCLE;

为方便起见,也可在DBeaver数据库的序列中右键新建序列,在完成序列命名后,完成序列的创建。
在这里插入图片描述

其次,根据需要将主键字段设置成所需数据类型,并与创建的序列绑定,设置默认值。

nextval('testseq_d_seq'::regclass)

在这里插入图片描述

1.2、序列延申

在内容的存储过程,有时候会遇到预处理数据后再存储的情况,本节以实现‘A-%’格式存储为例,即所有存储的主键字段必须以A-开头,展开介绍。

1.2.1、理论

在展开介绍前,首先查看了一些资料,以PostgreSQL 字符串函数汇总为主,该大神的博文中清晰的罗列了基本的字符串函数,因此本文就不再进行重复论述。根据需求,我们从中选取合适的函数开展数据预处理,设置主键默认值如下:

('A-'::text || nextval('testseq_d_seq'::regclass))

在这里插入图片描述

1.2.2、测试

通过输入SQL插入记录进行测试,最终输出的记录主键字段为‘A-2’,实现需求。

INSERT INTO public.testseq
(employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES(3091122, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

在这里插入图片描述

1.2.3、小结

在本小节中,我们以一个简单的示例介绍了数据库的数据预处理存储,后续大家也可以根据需要在数据库中自定义的使用函数进行需求实现,提高开发效率。当然,由于提供函数有限,针对较为复杂的预处理,依旧还是采用后端处理后再存储到数据库中。

二、函数

在PostgreSQL 数据库中自定义一些函数,可以有效帮助我们提高开发效率。本章主要介绍函数创建的2种方式:

2.1、SQL直接创建

2.1.1、理论

采用SQL创建属于万能的方式,基本的语句结构如下:

CREATE FUNCTION function_name(parameter1 datatype1, parameter2 datatype2, OUT output_parameter datatype)
RETURNS return_type AS $$
-- 函数体
$$ LANGUAGE language_name;
  • function_name函数名
  • parameter传参
  • datatype参数类型
  • output_parameter输出参数
  • return_type函数返回类型
  • language_name编程语言

为方便函数内容的更新,同时也避免由于相同函数命名存在导致执行报错的发生,增加OR REPLACE优化后的语句结构如下:

CREATE OR REPLACE FUNCTION function_name(parameter1 datatype1, parameter2 datatype2, OUT output_parameter datatype)
RETURNS return_type AS $$
-- 函数体
$$ LANGUAGE language_name;

2.1.2、测试

用SQL创建函数,需求如下:

  1. 可传不定长字符串、整型;
  2. 可更新时间;
  3. 可选传参数。

编写的SQL语句如下所示,其中character varying为不定长字符串数据类型:

CREATE OR REPLACE FUNCTION public.test_han(_employee_id integer, _last_name character varying, _salary integer DEFAULT 10,  _job_id character varying DEFAULT NULL, OUT _id character varying)RETURNS character varying AS $$BEGININSERT INTO testseq  (employee_id,last_name,hire_date,job_id,salary)VALUES(_employee_id,_last_name,now( ),_job_id,_salary) RETURNING id INTO _id;
END;
$$ LANGUAGE plpgsql

在DBeaver运行后,最终函数显示的源如下所示:

CREATE OR REPLACE FUNCTION public.test_han(_employee_id integer, _last_name character varying, _salary integer DEFAULT 10, _job_id character varying DEFAULT NULL::character varying, OUT _id character varying)RETURNS character varyingLANGUAGE plpgsql
AS $function$BEGININSERT INTO testseq  (employee_id,last_name,hire_date,job_id,salary)VALUES(_employee_id,_last_name,now( ),_job_id,_salary) RETURNING id INTO _id;
END;
$function$
;

两个SQL语句都可以正常运行。用语句select test_han(12,'test')进行函数调用,最终完成记录的插入,同时返回参数如下:
在这里插入图片描述

2.2、借用DBeaver创建

该方法本质依旧是执行SQL语句,只不过不需要进行函数创建的SQL语句编写,更关注于函数体的业务需求实现。

首先,将DBeaver切到public-存储过程,然后右键 新建 存储过程 ,填写函数名称、语言类型、返回参数类型,完成函数架构的搭建。
在这里插入图片描述
然后,在架构中编写函数体与传参。最后,快捷键Ctrl+S保存,点击执行,完成函数创建。
在这里插入图片描述

三、视图

视图是一张假表,只不过是通过相关的名称存储在数据库中的一个 PostgreSQL语句。而且视图是只读的,因此可能无法在视图上执行DELETE、INSERT 或UPDATE语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。

3.1、SQL语句

创建视图的SQL语句结构如下所示,注意以 结尾:

CREATE VIEW view_name AS 
--SELECT语句
  • view_name视图名

同样的,为了方便更新视图,避免出现存在同命名导致SQL执行失败情况的出现,采用OR REPLACE优化SQL语句,优化后的结构如下:

CREATE OR REPLACE VIEW view_name AS 
--SELECT语句

3.2、示例

获取表employees中数据创建视图,SQL语句如下:

CREATE OR REPLACE VIEW asd as select * from  employees e 

四、触发器

PostgreSQL支持两种级别的触发方式:行级(row-level)触发器和 语句级(statement-level)触发器,区别在于触发的时机和触发次数。例如,对于一个影响 20 行数据的 UPDATE 语句,行级触发器将会触发器 20 次,而语句级触发器只会触发 1 次。

4.1、SQL语句

创建触发器一共2步,首先用CREATE [OR REPLACE] FUNCTION创建触发器函数,其次用create trigger将触发器函数与表关联起来,从而完成创建。

4.1.1、触发器函数

基本的触发器函数SQL结构如下所示:

CREATE [ OR REPLACE ] FUNCTION trigger_function()
RETURNS trigger AS $$
-- 函数体
$$ LANGUAGE language_name;

触发器函数与普通函数创建类似,区别在于触发器函数没有传参,而且返回类型是trigger 。同时,在触发器函数的内部,系统自动封装了许多特殊的变量,这个在大神postgresql-触发器的博文中有清晰的罗列,这边就不进行重复的讲述,主要记录一些常用的:

  • NEW ,类型为 RECORD,代表了行级触发器 INSERT、UPDATE 操作之后的新数据行。对于 DELETE 操作或者语句级触发器而言,该变量为 null。
  • OLD,类型为 RECORD,代表了行级触发器 UPDATE、DELETE 操作之前的旧数据行。对于 INSERT 操作或者语句级触发器而言,该变量为 null。
  • TG_OP,触发的操作,INSERT、UPDATE、DELETE 或者 TRUNCATE。

4.1.2、函数与表关联

基本的关联SQL语句结构如下:

-- 使用 CREATE TRIGGER 语句创建一个触发器,语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {event [OR ...]}ON table_name[FOR [EACH] {ROW | STATEMENT}][WHEN ( condition ) ]EXECUTE FUNCTION trigger_function;
  • event 可以是在所提到的表table_name上的INSERT、UPDATE、DELETE、TRUNCATE操作,而且UPDATE 支持在表的一个或多个指定列上操作(UPDATE OF col1, clo2)。
  • 触发器可以在事件之前(BEFORE)或者之后(AFTER)
    触发,INSTEAD OF 只能用于替代视图上的 INSERT、UPDATE 或者 DELETE 操作。
  • FOR EACH ROW 表示行级触发器,FOR EACH STATEMENT 表示语句级触发器。
  • WHEN 用于指定一个额外的触发条件,满足条件才会真正支持触发器函数。

DROP 可以删除整个表,包括表结构和数据,速度最快;
TRUNCATE 可以快速地删除表中的所有数据,但不删除表结构,速度中等;
DELETE 可以删除表中的数据,不包括表结构,速度最慢。

4.2、示例

需求:实现当对表employees进行insertdeleteupdate时,进行历史记录保存,保存到employees_history

首先,创建触发器函数,SQL语句如下:

CREATE OR REPLACE FUNCTION public.track_emp_change()RETURNS triggerLANGUAGE plpgsql
AS $function$
begin -- tg_op 触发的操作 if tg_op = 'INSERT' theninsert into public.employees_history(employee_id, action_type, change_dt)values(new.employee_id,'INSERT',now());elsif tg_op = 'UPDATE' theninsert into public.employees_history(employee_id, action_type, change_dt)values(old.employee_id, 'UPDATE',now());elsif tg_op = 'DELETE' theninsert into public.employees_history(employee_id, action_type, change_dt)values(old.employee_id,'DELETE',now());end if;return new;
end ;
$function$
;

其次,创建表与函数的关联,SQL语句如下:

create trigger trg_employees_change before
insertor
deleteor
updateonpublic.employees for each row execute function track_emp_change()

最终,通过INSERT INTO public.employees(id, department_id, "time")VALUES(2390, 601, now())进行调用测试,完成需求实现。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【redis】Redis中的字典类型:数据结构与使用方法

文章目录 Redis中的字典类型:数据结构与使用方法简介如何提高哈希表性能如何使用 Redis中的字典类型:数据结构与使用方法 简介 Redis中的字典类型的底层实现是哈希表(Hash Table)。 Redis的字典使用哈希表作为底层实现&#xf…

目标检测再升级!YOLOv8模型训练和部署

YOLOv8 是 Ultralytics 开发的 YOLO(You Only Look Once)物体检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的SOTA模型,它建立在先前YOLO成功基础上,并引入了新功能和改进,以进一步提升性能和灵活性。它可…

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…

福建科立讯通信 指挥调度管理平台 多处文件上传漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任…

使用开源通义千问模型(Qwen)搭建自己的大模型服务

目标 1、使用开源的大模型服务搭建属于自己的模型服务; 2、调优自己的大模型; 选型 采用通义千问模型,https://github.com/QwenLM/Qwen 步骤 1、下载模型文件 开源模型库:https://www.modelscope.cn/models mkdir -p /data/…

【MATLAB】ICEEMDAN_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN-LSTM神经网络时序预测算法是一种结合了改进的完全扩展经验模态分解(ICEEMDAN)和长短期记忆神经网络(LSTM)的时间序列预测方法。 …

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中,音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎,它们不仅可以在运动时提供音乐的陪伴,还能增加运动时的乐趣和动力。但是,面对市面上众多不同类型的运动耳机,…

springboot集成cas客户端

Background 单点登录SSO(Single Sign ON),指在多个应用系统中,只需登录一次,即可在多个应用系统之间共享登录。统一身份认证CAS(Central Authentication Service)是SSO的开源实现,利用CAS实现SSO可以很大程…

TikTok时代的社交红利:用户生成内容的崛起

TikTok,这款短视频平台在全球范围内掀起了一场社交媒体的新浪潮。在这个数字化的时代,用户生成内容成为了社交平台的核心,而TikTok正是在这一潮流中崭露头角。本文将深入探讨TikTok时代的社交红利,聚焦用户生成内容的崛起&#xf…

服务器运行状况监控工具

服务器运行状况监视提供了每个服务器状态和性能的广泛概述,通过监控服务器指标,如 CPU 使用率、内存消耗、I/O、磁盘使用率、进程等,服务器运行状况监控可以避免服务器停机。 服务器性能监控指标 服务器是网络中最重要的组件之一&#xff0…

大创项目推荐 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步:将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时,就变得更加困难。如果您无法出售您的课程,那么没有什么比这更令人沮丧的了。 幸运的是,如果您使用的是 WordPress 网站,那么您可以非常轻松且免费地完成此操作。借助L…

阿里云99元服务器赠送云·原生建站(电商版)

购买阿里云99元服务器赠送云原生建站(电商版),什么是云原生建站?类似模板建站,云原生建站预置响应式模板CMS内容管理系统,用户可以按需随意切换模板样式,通过模板可视化在线编辑轻松完成网站搭建…

二进制部署

HOST HostnameIP地址flannedAPPmaster192.169.116.10ETCD\APIserver\Scheduler\Controller-Managernode1192.168.116.11172.17.28.0ETCD,Flanned,Kubelet,kube-proxynode2192.168.116.12172.17.26.0ETCD,Flanned,Kubelet,kube-proxy Kubernetes社区 Kubernetes文档 ETCD mas…

Spark内核解析-数据存储5(六)

1、Spark的数据存储 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk,本文尝试分析Spark中存储子系统的构成,并以数据写入和数据读取为例,讲述清楚存储子系统中各部件的交互关系。 1.1存储子系统概览 …

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程,旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要,因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

juniper EX系列交换机COS配置

流分类、流量监管、流量整形、拥塞管理和拥塞避免是构造有区别地实施服务的基石,它们主要完成如下功能: 流分类:依据一定的匹配规则识别出对象。流分类是有区别地实施服务的前提。 流量监管:对进入设备的特定流量的规格进行监管…

Vue-4、单向数据绑定与双向数据绑定

1、单向数据绑定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数据绑定</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/…

【QML COOK】- 004-添加动画

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {id: backgroudanchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"Behavior on rotation {NumberAnimation {duration: 1000}}}…

如何用UE5 的小白人替换成自己的 metahumen 数字人

1、用QuixelBridge 插件导入制作好的metahumen数字人 2、创建项目时如有选择第三人称游戏&#xff0c;在内容目录中找到第三人称游戏小白人的蓝图类&#xff0c;对其进行复制一个&#xff0c;重命名&#xff0c;我这里命名为BP_METAHUMEN&#xff0c; 并移到Metahumen目录下方便…