当前位置: 首页 > news >正文

PostgreSQL 高级功能(五)

1. 存储过程与函数

1.1 创建存储过程

存储过程是一组预编译的SQL语句,可以简化复杂的操作。以下是一个简单的存储过程示例:

CREATE OR REPLACE FUNCTION add_user(username VARCHAR, email VARCHAR) 
RETURNS VOID AS $$
BEGININSERT INTO users (username, email) VALUES (username, email);
END;
$$ LANGUAGE plpgsql;

调用存储过程:

SELECT add_user('john_doe', 'john@example.com');

1.2 创建函数

函数与存储过程类似,但函数可以返回值。以下是一个计算两数之和的函数示例:

CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER) 
RETURNS INTEGER AS $$
BEGINRETURN a + b;
END;
$$ LANGUAGE plpgsql;

调用函数:

SELECT add_numbers(10, 20);

2. 触发器

触发器是在特定事件发生时自动执行的程序,如插入、更新或删除操作。

2.1 创建触发器

以下示例展示了在 users 表上创建触发器,当插入新用户时,自动记录时间戳到 audit_log 表:

CREATE TABLE audit_log (id SERIAL PRIMARY KEY,username VARCHAR(50),action VARCHAR(50),action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE OR REPLACE FUNCTION log_user_action() 
RETURNS TRIGGER AS $$
BEGININSERT INTO audit_log (username, action) VALUES (NEW.username, 'INSERT');RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE FUNCTION log_user_action();

3. 扩展与模块

PostgreSQL 提供了丰富的扩展,可以扩展其功能。

3.1 安装与使用扩展

例如,安装并使用 pgcrypto 扩展进行数据加密:

CREATE EXTENSION pgcrypto;-- 使用 pgcrypto 进行数据加密
INSERT INTO users (username, email, password) VALUES 
('alice', 'alice@example.com', crypt('mypassword', gen_salt('bf')));

3.2 常用扩展

  • PostGIS: 提供地理空间数据支持。
  • pg_trgm: 支持基于三元组的字符串相似性搜索。
  • hstore: 键值对存储。

4. 全文搜索

PostgreSQL 提供了强大的全文搜索功能,用于高效地搜索文本数据。

4.1 配置全文搜索

创建表并插入数据:

CREATE TABLE documents (id SERIAL PRIMARY KEY,content TEXT
);INSERT INTO documents (content) VALUES 
('PostgreSQL is a powerful, open-source object-relational database system.'),
('It has a proven architecture and runs on all major operating systems.');

4.2 创建全文搜索索引

创建全文搜索索引以提高搜索效率:

CREATE INDEX idx_gin_content ON documents USING GIN (to_tsvector('english', content));

4.3 执行全文搜索

使用 to_tsvectorto_tsquery 函数进行全文搜索:

SELECT * FROM documents
WHERE to_tsvector('english', content) @@ to_tsquery('PostgreSQL & powerful');

5. JSON 数据类型与操作

PostgreSQL 支持存储和操作 JSON 数据类型,非常适合处理半结构化数据。

5.1 存储 JSON 数据

创建包含 JSON 数据类型的表:

CREATE TABLE products (id SERIAL PRIMARY KEY,name VARCHAR(100),attributes JSONB
);INSERT INTO products (name, attributes) VALUES 
('Laptop', '{"brand": "Dell", "memory": "16GB", "storage": "512GB"}'),
('Smartphone', '{"brand": "Apple", "memory": "4GB", "storage": "64GB"}');

5.2 查询 JSON 数据

使用操作符和函数查询 JSON 数据:

-- 查询 brand 为 Dell 的产品
SELECT * FROM products
WHERE attributes->>'brand' = 'Dell';-- 查询并提取存储大小
SELECT name, attributes->>'storage' AS storage FROM products;

6. 案例实战

6.1 练习题目

  1. 创建一个存储过程,插入订单数据并更新库存。
  2. 创建一个触发器,在删除订单时记录日志。
  3. 使用 pgcrypto 加密用户密码。
  4. 为产品描述字段创建全文搜索索引并执行搜索。

6.2 示例答案

  1. 创建存储过程:
CREATE OR REPLACE FUNCTION add_order(user_id INTEGER, product_id INTEGER, quantity INTEGER) 
RETURNS VOID AS $$
BEGININSERT INTO orders (user_id, product_id, quantity) VALUES (user_id, product_id, quantity);UPDATE products SET stock = stock - quantity WHERE id = product_id;
END;
$$ LANGUAGE plpgsql;
  1. 创建触发器:
CREATE TABLE order_log (id SERIAL PRIMARY KEY,order_id INTEGER,action VARCHAR(50),action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE OR REPLACE FUNCTION log_order_deletion() 
RETURNS TRIGGER AS $$
BEGININSERT INTO order_log (order_id, action) VALUES (OLD.id, 'DELETE');RETURN OLD;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER after_order_delete
AFTER DELETE ON orders
FOR EACH ROW
EXECUTE FUNCTION log_order_deletion();
  1. 使用 pgcrypto 加密用户密码:
CREATE EXTENSION pgcrypto;UPDATE users SET password = crypt('newpassword', gen_salt('bf')) WHERE username = 'alice';
  1. 创建全文搜索索引并执行搜索:
CREATE INDEX idx_gin_description ON products USING GIN (to_tsvector('english', description));SELECT * FROM products
WHERE to_tsvector('english', description) @@ to_tsquery('powerful & laptop');

系统文章目录:

PostgreSQL 简介与基础(一)

PostgreSQL 基本SQL语法(二)

PostgreSQL 高级SQL查询(三)

PostgreSQL 数据库设计与管理(四)

PostgreSQL 高级功能(五)

PostgreSQL 性能优化与调优(六)

PostgreSQL 高可用性与灾难恢复策略(七)

PostgreSQL 安全性与权限管理(八)

PostgreSQL 高级功能与扩展(九)

PostgreSQL 分区表与并行查询(十)

PostgreSQL 索引优化与性能调优(十一)

PostgreSQL 日志管理与故障排查(十二)

PostgreSQL 高可用性与容错性(十三)

http://www.lryc.cn/news/383443.html

相关文章:

  • 食品企业仓储式批发零售一体化解决方案
  • chrome插件,修改对应URL的http请求的header头,包括ajax请求
  • C语言 | Leetcode C语言题解之第191题位1的个数
  • 【C++11(二)】lambda表达式和可变参数模板
  • 昇思25天学习打卡营第2天|张量Tensor
  • [leetcode]valid-triangle-number. 有效三角形的个数
  • java SQL server 多实例的情况
  • html--404页面
  • [word] Word如何删除所有的空行? #职场发展#学习方法
  • 【CSS】深入探讨 CSS 的 `calc()` 函数
  • MongoDB异地备份数据文件脚本(带日志打印,便于排查)
  • 论文导读 | Manufacturing Service Operations Management近期文章精选
  • 【Linux命令】top linux下的任务管理器
  • 2024年在分数限制下,选好专业还是选好学校?
  • cropperjs 裁剪/框选图片
  • ArkTS开发系列之事件(2.8.2手势事件)
  • 【MATLAB源码-第135期】基于matlab的变色龙群优化算法CSA)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • 使用Python实现深度学习模型:语言模型与文本生成
  • 大数据面试题之Hive(3)
  • 华为OD机考题HJ17 坐标移动
  • redis修改密码
  • 《昇思 25 天学习打卡营第 7 天 | 模型训练 》
  • HTML/CSS 基础
  • Linux系统安装Lua语言及Lua外部库
  • 前端技术栈学习:Vue2、Vue cli脚手架、ElementUI组件库、Axios
  • pycharm中取消Typo:In word ‘xxx‘提示(绿色波浪线提示)的方法
  • js中的浅拷贝和深拷贝
  • 【Linux】常用基本命令
  • uniapp——上传图片获取到file对象而非临时地址——基础积累
  • vue3 antdv RadioButton默认值选择问题处理