PostgreSQL 高级功能(五)

1. 存储过程与函数

1.1 创建存储过程

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

sql 复制代码
CREATE OR REPLACE FUNCTION add_user(username VARCHAR, email VARCHAR) 
RETURNS VOID AS $$
BEGIN
    INSERT INTO users (username, email) VALUES (username, email);
END;
$$ LANGUAGE plpgsql;

调用存储过程:

sql 复制代码
SELECT add_user('john_doe', 'john@example.com');

1.2 创建函数

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

sql 复制代码
CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER) 
RETURNS INTEGER AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;

调用函数:

sql 复制代码
SELECT add_numbers(10, 20);

2. 触发器

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

2.1 创建触发器

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

sql 复制代码
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 $$
BEGIN
    INSERT 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 扩展进行数据加密:

sql 复制代码
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 配置全文搜索

创建表并插入数据:

sql 复制代码
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 创建全文搜索索引

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

sql 复制代码
CREATE INDEX idx_gin_content ON documents USING GIN (to_tsvector('english', content));

4.3 执行全文搜索

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

sql 复制代码
SELECT * FROM documents
WHERE to_tsvector('english', content) @@ to_tsquery('PostgreSQL & powerful');

5. JSON 数据类型与操作

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

5.1 存储 JSON 数据

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

sql 复制代码
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 数据:

sql 复制代码
-- 查询 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. 创建存储过程:
sql 复制代码
CREATE OR REPLACE FUNCTION add_order(user_id INTEGER, product_id INTEGER, quantity INTEGER) 
RETURNS VOID AS $$
BEGIN
    INSERT 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. 创建触发器:
sql 复制代码
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 $$
BEGIN
    INSERT 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 加密用户密码:
sql 复制代码
CREATE EXTENSION pgcrypto;

UPDATE users SET password = crypt('newpassword', gen_salt('bf')) WHERE username = 'alice';
  1. 创建全文搜索索引并执行搜索:
sql 复制代码
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 高可用性与容错性(十三)

相关推荐
wyiyiyi2 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任3 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
喂完待续4 小时前
Apache Hudi:数据湖的实时革命
大数据·数据仓库·分布式·架构·apache·数据库架构
青云交4 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
xiep14383335106 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Java小白程序员6 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
老虎06277 小时前
数据库基础—SQL语句总结及在开发时
数据库·sql·oracle
爱掘金的土拨鼠8 小时前
国产化dm数据库锁表解锁
数据库
庖丁解java9 小时前
N个Utils
数据库
Mr. zhihao9 小时前
SQL LEFT JOIN 与 WHERE 条件的隐藏坑
数据库·sql